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.


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.


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") }))
    }
}

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)
            }
        }
    }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.