NavigationLink ne fonctionne qu'une seule fois

75

Je travaillais sur une application avec connexion et après la connexion, des catégories sont répertoriées. Et sous chaque catégorie, certains éléments sont répertoriés horizontalement. La chose est après la connexion, la page principale apparaît et tout est répertorié. Lorsque vous cliquez sur un élément, il passe à l'écran détaillé, mais lorsque vous essayez de revenir en arrière, il se bloque simplement. J'ai trouvé ce flux Pourquoi mon application SwiftUI se bloque-t-elle lors de la navigation vers l'arrière après avoir placé un `NavigationLink` à l'intérieur d'un` navigationBarItems` dans un `NavigationView`? mais je n'ai pas pu résoudre mon problème. Depuis que mon projet est devenu compliqué, je voulais juste pratiquer la navigation dans swiftui et j'ai créé un nouveau projet. Au fait, j'ai téléchargé la dernière version de xcode 11.3. J'ai écrit un code simple comme suit:

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

Et la vue Test () est la suivante:

import SwiftUI

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

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

Comme vous pouvez le voir, c'est vraiment simple. J'ai également essayé des exemples similaires sur Internet, mais cela ne fonctionne pas comme il le suppose. Lorsque j'exécute le projet, je clique sur le lien de navigation et il accède à la vue Test (). Ensuite, je clique sur le bouton retour et il accède à la page principale. Cependant, lorsque je clique sur le lien de navigation une deuxième fois, rien ne se produit. Le lien de navigation ne fonctionne qu'une seule fois et après cela, rien ne se passe. Il ne navigue pas, il ne jette aucune erreur. Je suis nouveau sur swiftui et tout est super mais la navigation. J'ai essayé de nombreux exemples et suggéré des solutions sur Internet, mais rien ne semble résoudre mes problèmes.

C.Aglar
la source
2
version de xCode 11.2 (11B52), ce code fonctionne comme prévu sur le canevas et sur l'appareil
Александр Грабовский
3
Test de votre instantané de code avec Xcode 11.2 / iOS 13.2 - fonctionne bien. Essayez de rétrograder Xcode.
Asperi
1
Xcode version 11.2.1 (11B500) votre code fonctionne comme il se doit.
Nalov
2
J'ai envoyé un avis à Apple, il reste à attendre une future mise à jour
Александр Грабовский
1
Rapport de bogue envoyé FB7518930
Pacu

Réponses:

56

[MISE À JOUR] 12 février 2020 - J'ai vérifié ce problème dans la version bêta de Xcode 11.4 et j'ai constaté que ce problème avait été résolu.


J'obtenais le même problème dans mon projet aussi, quand je le testais dans le simulateur de Xcode. Cependant, lorsque j'ai lancé l'application sur un appareil réel (iPhone X avec iOS 13.3), cela NavigationLinkfonctionnait parfaitement. Donc, cela ressemble vraiment au bogue de Xcode.

Sagun Raj Lage
la source
10
exactement la même chose pour moi. Je commence à regretter d'avoir choisi Swiftui pour une nouvelle application
theMouk
6
je viens de passer 4 heures à me sentir très stupide ... Ce truc n'est pas prêt pour la production ...
Sebastian
SwiftUI est toujours fondamentalement la version 1.0 Avez-vous déjà prévu d'utiliser la version 1.0 de quelque chose pour une version de production? Vous commencez avec cela dans l'espoir qu'il s'améliorera. Cela n'aide pas si vous devez libérer avant cela.
David Reich
@DavidReich si SwiftUI était en version bêta, je pouvais comprendre qu'il y aurait beaucoup de problèmes. Dans l'outillage prêt pour la production, le moins à attendre est qu'il fonctionne. Il y a eu plusieurs «mises à jour ponctuelles» d'iOS et de macOS depuis la version initiale de l'année dernière, donc des bogues flagrants comme celui-ci ou le «bogue du titre de la liste sautante» auraient dû être supprimés il y a longtemps. J'ai essayé de l'utiliser pour une application de production, mais j'ai dû retourner à UIKit pour obtenir un résultat décent.
GJ Nilsen
3
[MISE À JOUR] 12 février 2020 - J'ai vérifié ce problème dans la version bêta de Xcode 11.4 et j'ai constaté que ce problème avait été résolu.
Sagun Raj Lage
5

Simulator 11.4: ce problème a été corrigé

Vous devez réinitialiser la isActivevaleur par défaut dans la deuxième vue. Il fonctionne sur les appareils et les émulateurs.

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
la source
J'ai des problèmes avec le simulateur et mon appareil physique pour que NavigationLink fonctionne plus d'une fois. Rien ne le corrige dans le simulateur, mais une méthode similaire à celle qui fonctionne pour mon appareil physique consiste à définir un onDisappear sur le View2 qui réinitialise l'indicateur actif. C'est une solution de contournement légèrement plus propre pour un bogue Xcode (car vous n'avez pas à vous lier à un état que View2 ne devrait pas connaître). NavigationViewDemo_View2 (). OnDisappear (perform: {self.isActive = false})
SJoshi
@SJoshi Je l'ai eu mais onDisappear sera appelé après isActiveest faux, donc NavigationView ne fonctionnera pas correctement. C'est une solution temporaire pour les émulateurs uniquement parce que NavigationView fonctionne correctement sur les appareils. Dans les versions précédentes des émulateurs, NavigationView fonctionnait, j'espère qu'il sera corrigé dans le futur émulateur.
Victor Kushnerov
Étrangement, ce code ne fonctionne pas sur mon simulateur OU périphérique physique - la solution que j'ai proposée réinitialise l'indicateur actif lorsque la vue de détail est fermée et permet au périphérique physique de fonctionner. Le mot dans la rue est que Xcode 13.4 résout ce problème
SJoshi
J'ai testé sur le simulateur 11.3.1 cela fonctionne comme un charme. Vous voyez 3 départs, je suppose que d'autres ont aussi aidé.
Victor Kushnerov
Oui, moi aussi, j'ai testé cela - en utilisant plusieurs iPhones. En outre, testé sur 4 appareils physiques - pas de chance. Ce bug est définitivement ridicule. J'ai fini par faire une solution de contournement ridicule en attendant pour le simulateur.
SJoshi
1

Comme @ Александр Грабовский a dit que cela ressemble à un bogue Xcode 11.3, je rencontre le même problème, vous devez rétrograder ou utiliser une solution de contournement comme le bouton de retour personnalisé comme ci-dessous

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
la source