NavigationLink funktioniert nur einmal


75

Ich habe an einer Anwendung mit Login gearbeitet und nach dem Login sind Kategorien aufgelistet. Und unter jeder Kategorie sind einige Elemente horizontal aufgelistet. Die Sache ist nach dem Login, die Hauptseite erscheint und alles ist großartig aufgelistet. Wenn Sie auf ein Element klicken, wird ein detaillierter Bildschirm angezeigt. Wenn Sie jedoch versuchen, zurückzukehren, stürzt es einfach ab. Ich habe diesen Ablauf gefunden. Warum stürzt meine SwiftUI-App ab, wenn Sie rückwärts navigieren, nachdem Sie einen "NavigationLink" in einem "navigationBarItems" in einer "NavigationView" platziert haben? aber ich konnte mein Problem nicht lösen. Da mein Projekt kompliziert wurde, wollte ich nur schnell die Navigation üben und habe ein neues Projekt erstellt. Übrigens habe ich die neueste xcode Version 11.3 heruntergeladen. Ich habe einen einfachen Code wie folgt geschrieben:

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

Die Ansicht von Test () lautet wie folgt:

import SwiftUI

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

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

Wie Sie sehen können, ist es wirklich einfach. Ich habe auch ähnliche Beispiele im Internet ausprobiert, aber es funktioniert nicht so, wie es angenommen wird. Wenn ich das Projekt ausführe, klicke ich auf den Navigationslink und er navigiert zur Ansicht Test (). Dann klicke ich auf die Schaltfläche Zurück und es navigiert zur Hauptseite. Wenn ich jedoch das zweite Mal auf den Navigationslink klicke, passiert nichts. Der Navigationslink funktioniert nur einmal und danach passiert nichts mehr. Es navigiert nicht, es wird kein Fehler ausgegeben. Ich bin neu in Swiftui und alles ist großartig, außer der Navigation. Ich habe viele Beispiele ausprobiert und Lösungen im Internet vorgeschlagen, aber nichts scheint meine Probleme zu beheben.


2
Version von xCode 11.2 (11B52), dieser Code funktioniert wie erwartet sowohl auf der Leinwand als auch auf dem Gerät
--лександр Грабовский

3
Testete deinen Code-Snapshot mit Xcode 11.2 / iOS 13.2 - funktioniert gut. Versuchen Sie, Xcode herunterzustufen.
Asperi

1
Xcode Version 11.2.1 (11B500) Ihr Code funktioniert wie es muss.
Nalov

2
Ich habe eine Bewertung an Apple gesendet, es bleibt noch auf ein zukünftiges Update zu warten
Александр Грабовский

1
Fehlerbericht gesendet FB7518930
Pacu

Antworten:


56

[UPDATE] 12. Februar 2020 - Ich habe in Xcode 11.4 Beta nach diesem Problem gesucht und festgestellt, dass dieses Problem behoben wurde.


Ich hatte das gleiche Problem auch in meinem Projekt, als ich es im Xcode-Simulator testete. Als ich die App jedoch auf einem realen Gerät (iPhone X mit iOS 13.3) startete, NavigationLinkfunktionierte sie völlig einwandfrei. Es scheint also wirklich ein Fehler von Xcode zu sein.


10
genau das gleiche für mich. Ich fange an zu bedauern, Swiftui für eine neue App ausgewählt zu haben
theMouk

6
Ich habe gerade 4 Stunden damit verbracht, mich sehr dumm zu fühlen ... Dieses Zeug ist nicht produktionsbereit ...
Sebastian

SwiftUI ist im Grunde immer noch Version 1.0. Planen Sie jemals, Version 1.0 von irgendetwas für eine Produktionsversion zu verwenden? Sie beginnen damit mit der Erwartung, dass es sich verbessern wird. Dies hilft nicht, wenn Sie vorher freigeben müssen.
David Reich

@DavidReich Wenn SwiftUI in der Beta wäre, könnte ich verstehen, dass es viele Probleme geben würde. Bei produktionsfertigen Werkzeugen muss man mindestens damit rechnen, dass es funktioniert. Seit der ersten Veröffentlichung im letzten Jahr gab es mehrere "Punkt-Updates" für iOS und MacOS. Daher sollten eklatante Fehler wie dieser oder der "Sprunglisten-Titelfehler" schon vor langer Zeit beseitigt werden. Ich habe versucht, es für eine Produktions-App zu verwenden, musste aber zu UIKit zurückkehren, um ein anständiges Ergebnis zu erzielen.
GJ Nilsen

3
[UPDATE] 12. Februar 2020 - Ich habe in Xcode 11.4 Beta nach diesem Problem gesucht und festgestellt, dass dieses Problem behoben wurde.
Sagun Raj Lage

5

Simulator 11.4: Dieses Problem wurde behoben

Sie müssen den Standardwert isActivein der zweiten Ansicht zurücksetzen . Es funktioniert auf Geräten und Emulatoren.

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

Ich habe Probleme sowohl mit dem Simulator als auch mit meinem physischen Gerät, wenn NavigationLink mehr als einmal funktioniert. Nichts behebt es im Simulator, aber eine ähnliche Methode wie diese, die für mein physisches Gerät funktioniert, ist das Setzen von onDisappear in View2, wodurch das aktive Flag zurückgesetzt wird. Dies ist eine geringfügig sauberere Problemumgehung für einen Xcode-Fehler (da Sie sich nicht an einen Status binden müssen, von dem View2 nichts wissen sollte). NavigationViewDemo_View2 (). OnDisappear (ausführen: {self.isActive = false})
SJoshi

@SJoshi Ich habe es bekommen, onDisappear werde aber aufgerufen, nachdem isActivees falsch ist, sodass NavigationView nicht richtig funktioniert. Es ist nur eine vorübergehende Lösung für Emulatoren, da NavigationView auf Geräten ordnungsgemäß funktioniert. In früheren Versionen von Emulatoren hat NavigationView funktioniert. Ich hoffe, dass dies in zukünftigen Emulatoren behoben wird.
Victor Kushnerov

Seltsamerweise funktioniert dieser Code nicht auf meinem Simulator ODER meinem physischen Gerät. Die von mir vorgeschlagene Lösung setzt das aktive Flag zurück, wenn die Detailansicht geschlossen wird, und ermöglicht, dass das physische Gerät funktioniert. Auf der Straße heißt es, dass Xcode 13.4 dieses Problem behebt
SJoshi

Ich habe auf Simulator 11.3.1 getestet, es funktioniert wie ein Zauber. Sie sehen 3 Starts, ich nehme an, andere haben auch geholfen.
Victor Kushnerov

Ja, auch ich habe das getestet - mit mehreren iPhones. Auch auf 4 physischen Geräten getestet - kein Glück. Dieser Fehler ist definitiv lächerlich. In der Zwischenzeit habe ich eine lächerliche Problemumgehung für den Simulator durchgeführt.
SJoshi


1

Da @ Александр Грабовский sagte, es scheint ein Xcode 11.3-Fehler zu sein, stoße ich auf dasselbe Problem. Sie müssen ein Downgrade durchführen oder eine Problemumgehung wie die benutzerdefinierte Zurück-Schaltfläche wie unten verwenden

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)
            }
        }
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.