NavigationLink funciona apenas uma vez

75

Eu estava trabalhando em um aplicativo com login e, após o login, há categorias listadas. E em cada categoria, existem alguns itens listados horizontalmente. A coisa é após o login, a página principal aparece e tudo está listado muito bem. Quando você clica em um item, ele é exibido na tela detalhada, mas quando você tenta voltar, ele trava. Encontrei esse fluxo Por que meu aplicativo SwiftUI falha ao navegar para trás depois de colocar um `NavigationLink` dentro de um` navigationBarItems` em um `NavigationView`? mas não consegui resolver o meu problema. Como meu projeto ficou complicado, eu só queria praticar a navegação no swiftui e criei um novo projeto. A propósito, baixei a última versão do xcode 11.3. Eu escrevi um código simples da seguinte maneira:

NavigationView{
        NavigationLink(destination: Test()) {
            Text("Show Detail View")
        }
    .navigationBarTitle("title1")

E a visualização Test () é a seguinte:

import SwiftUI

struct Test: View {
    var body: some View {
        Text("Hello, World!")
    }
}

struct Test_Previews: PreviewProvider {
    static var previews: some View {
        Test()
    }
}

Como você pode ver, é realmente simples. Eu também tentei exemplos semelhantes na internet, mas não funciona da maneira que supõe que funcione. Quando executo o projeto, clico no link de navegação e ele navega para a visualização Test (). Depois clico no botão Voltar e ele navega para a página principal. No entanto, quando clico no link de navegação pela segunda vez, nada acontece. O link de navegação funciona apenas uma vez e depois nada acontece. Ele não navega, não gera nenhum erro. Eu sou novo no swiftui e tudo é ótimo, exceto a navegação. Tentei muitos exemplos e sugeri soluções na internet, mas nada parece resolver meus problemas.

C.Aglar
fonte
2
versão do Xcode 11,2 (11B52), este código funciona como esperado tanto na tela e o dispositivo
Александр Грабовский
3
Teste seu instantâneo de código com o Xcode 11.2 / iOS 13.2 - funciona bem. Tente fazer o downgrade do Xcode.
Asperi
11
Xcode versão 11.2.1 (11B500), seu código funciona como deve.
Nalov 11/12/19
2
Enviei um comentário para a Apple, resta aguardar uma atualização futura
Александр Грабовский
11
Relatório de bug enviado FB7518930
Pacu

Respostas:

56

[ATUALIZAÇÃO] 12 de fevereiro de 2020 - verifiquei esse problema no Xcode 11.4 beta e constatei que esse problema foi resolvido.


Eu também estava recebendo o mesmo problema no meu projeto, quando o estava testando no simulador do Xcode. No entanto, quando iniciei o aplicativo em um dispositivo real (iPhone X com iOS 13.3), NavigationLinkestava funcionando perfeitamente. Então, realmente parece o bug do Xcode.

Sagun Raj Lage
fonte
10
exatamente o mesmo para mim. Estou começando a me arrepender de ter escolhido o Swiftui para um novo aplicativo
theMouk
6
eu passei 4 horas me sentindo muito estúpido ... Esse material não está pronto para produção ...
Sebastian
O SwiftUI ainda é basicamente a versão 1.0. Você planeja usar a versão 1.0 de alguma coisa para um release de produção? Você começa com a expectativa de que irá melhorar. Isso não ajuda se você precisar liberar antes que isso aconteça.
David Reich
@DavidReich se o SwiftUI estivesse na versão beta, eu poderia entender que haveria muitos problemas. Em ferramentas prontas para produção, o mínimo que se espera é que funcione. Houve várias "atualizações pontuais" do iOS e do macOS desde o lançamento inicial no ano passado, portanto, erros flagrantes como este ou o "bug do título da lista de saltos" deveriam ter sido eliminados há muito tempo. Tentei usá-lo para um aplicativo de produção, mas tive que voltar ao UIKit para obter um resultado decente.
GJ Nilsen
3
[ATUALIZAÇÃO] 12 de fevereiro de 2020 - verifiquei esse problema no Xcode 11.4 beta e constatei que esse problema foi resolvido.
Sagun Raj Lage 14/02
5

Simulador 11.4: esse problema foi corrigido

Você precisa redefinir o isActivevalor padrão na segunda visualização. Funciona em dispositivos e emuladores.

struct NavigationViewDemo: View {
    @State var isActive = false

    var body: some View {
        NavigationView {
            VStack {
                Text("View1")
                NavigationLink(
                    destination: NavigationViewDemo_View2(isActive: $isActive),
                    isActive: $isActive,
                    label: { Button(action: { self.isActive = true }, label: { Text("click") }) })
            }
        }
    }
}

struct NavigationViewDemo_View2: View {
    @Binding var isActive: Bool

    var body: some View {
        Text("View2")
            .navigationBarItems(leading: Button(action: { self.isActive = false }, label: { Text("Back") }))
    }
}
Victor Kushnerov
fonte
Estou tendo problemas com o simulador e meu dispositivo físico para fazer o NavigationLink funcionar mais de uma vez. Nada o corrige no simulador, mas um método semelhante ao que funciona para o meu dispositivo físico é definir um onDisappear no View2 que redefine o sinalizador ativo. É uma solução marginalmente mais limpa para um bug do Xcode (porque você não precisa se vincular a um estado que o View2 não deveria conhecer). NavigationViewDemo_View2 (). OnDisappear (execute: {self.isActive = false})
SJoshi
@ Joshi Eu entendi, mas onDisappear será chamado depois isActiveé falso, portanto o NavigationView não funcionará corretamente. É uma solução temporária para emuladores apenas porque o NavigationView funciona corretamente nos dispositivos. Nas versões anteriores dos emuladores NavigationView funcionou, espero que seja corrigido no futuro emulador.
Victor Kushnerov
Estranhamente, esse código não funciona no meu simulador OU dispositivo físico - a solução que eu propus redefine o sinalizador ativo quando a exibição de detalhes é descartada e permite que o dispositivo físico funcione. Dizem que o Xcode 13.4 corrige esse problema
SJoshi
Eu testei no simulador 11.3.1, ele funciona como um encanto. Você vê 3 partidas, suponho que outros ajudaram também.
Victor Kushnerov 14/02
Sim, eu também testei nisso - usando vários iPhones. Além disso, testado em 4 dispositivos físicos - sem sorte. Esse bug é definitivamente ridículo. Enquanto isso, acabei fazendo uma solução ridícula para o simulador.
SJoshi 14/02
1

Como o @ Александр Грабовский disse que parece um bug do Xcode 11.3, estou encontrando o mesmo problema, você deve fazer o downgrade ou usar alguma solução alternativa, como o botão voltar personalizado, como abaixo

struct ContentView: View {
    @State private var pushed: Bool = false

    var body: some View {

        NavigationView {
            VStack {
                Button("Show Detail View") {
                    self.pushed.toggle()
                }

                NavigationLink(destination: Test(pushed: $pushed), isActive: $pushed) { EmptyView() }
            }.navigationBarTitle("title1")
        }
    }
}
struct Test: View {
    @Binding var pushed: Bool
    var body: some View {
        Text("Hello, World!")
            .navigationBarBackButtonHidden(true)
            .navigationBarItems(leading: BackButton(label: "Back") {
                self.pushed = false
            })
    }
}
struct BackButton: View {
    let label: String
    let closure: () -> ()

    var body: some View {
        Button(action: { self.closure() }) {
            HStack {
                Image(systemName: "chevron.left")
                Text(label)
            }
        }
    }
}
ozmpai
fonte