NavigationLink funziona solo per una volta


75

Stavo lavorando su un'applicazione con login e dopo il login ci sono le categorie elencate. E sotto ogni categoria ci sono alcuni elementi elencati in orizzontale. Il problema è dopo il login, appare la pagina principale e tutto è elencato alla grande. Quando si fa clic su un elemento, si passa alla schermata dettagliata, ma quando si tenta di tornare indietro, si blocca. Ho trovato questo flusso Perché la mia app SwiftUI si arresta in modo anomalo durante la navigazione all'indietro dopo aver posizionato un `NavigationLink` all'interno di un 'navigationBarItems` in un' NavigationView`? ma non sono riuscito a risolvere il mio problema. Da quando il mio progetto è diventato complicato, volevo solo praticare la navigazione in Swiftui e ho creato un nuovo progetto. A proposito, ho scaricato l'ultima versione di xcode 11.3. Ho scritto un codice semplice come segue:

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

E la vista Test () è la seguente:

import SwiftUI

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

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

Come puoi vedere è davvero semplice. Ho anche provato esempi simili su Internet ma non funziona come dovrebbe funzionare. Quando eseguo il progetto, faccio clic sul collegamento di navigazione e passa alla vista Test (). Quindi faccio clic sul pulsante Indietro e passa alla pagina principale. Tuttavia, quando faccio clic sul collegamento di navigazione una seconda volta, non succede nulla. Il collegamento di navigazione funziona solo una volta e successivamente non succede nulla. Non naviga, non designa alcun errore. Sono nuovo di Swiftui e tutto è fantastico tranne la navigazione. Ho provato molti esempi e suggerito soluzioni su Internet, ma nulla sembra risolvere i miei problemi.


2
versione di xCode 11.2 (11B52), questo codice funziona come previsto sia
sull'area di disegno che

3
Testato l'istantanea del codice con Xcode 11.2 / iOS 13.2 - funziona bene. Prova a eseguire il downgrade di Xcode.
Asperi l'

1
Xcode versione 11.2.1 (11B500) il codice funziona come deve.
Nalov,

2
Ho inviato una recensione ad Apple, resta da aspettare un futuro aggiornamento
Александр Грабовский

1
Segnalazione bug inviata FB7518930
Pacu

Risposte:


56

[AGGIORNAMENTO] 12 febbraio 2020 - Ho verificato questo problema in Xcode 11.4 beta e ho scoperto che questo problema è stato risolto.


Stavo riscontrando lo stesso problema anche nel mio progetto, quando lo stavo testando nel simulatore di Xcode. Tuttavia, quando ho lanciato l'app su un dispositivo reale (iPhone X con iOS 13.3), NavigationLinkfunzionava perfettamente. Quindi, sembra davvero il bug di Xcode.


10
esattamente lo stesso per me. Sto cominciando a pentirmi di aver scelto Swiftui per una nuova app
theMouk

6
ho appena trascorso 4 ore a sentirmi molto stupido ... Questa roba non è pronta per la produzione ...
Sebastian

SwiftUI è ancora sostanzialmente la versione 1.0 Pensi mai di usare la v 1.0 di qualcosa per una versione di produzione? Inizi con esso con l'aspettativa che migliorerà. Questo non aiuta se è necessario rilasciare prima che ciò accada.
David Reich,

@DavidReich se SwiftUI fosse in beta, potrei capire che ci sarebbero molti problemi. Negli utensili pronti per la produzione, il minimo che ci si deve aspettare è che funzioni. Ci sono stati diversi "aggiornamenti puntuali" di iOS e macOS dalla versione iniziale dello scorso anno, quindi bug appariscenti come questo o "bug del titolo della Jump List" avrebbero dovuto essere eliminati molto tempo fa. Ho provato a usarlo per un'app di produzione, ma ho dovuto tornare su UIKit per ottenere un risultato decente.
GJ Nilsen,

3
[AGGIORNAMENTO] 12 febbraio 2020 - Ho verificato questo problema in Xcode 11.4 beta e ho scoperto che questo problema è stato risolto.
Sagun Raj Lage,

5

Simulatore 11.4: questo problema è stato risolto

È necessario ripristinare il valore predefinito isActive valore nella seconda vista. Funziona su dispositivi ed emulatori.

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

Sto riscontrando problemi sia con il simulatore che con il mio dispositivo fisico per far funzionare NavigationLink più di una volta. Nulla lo risolve nel simulatore, ma un metodo simile a questo che funziona per il mio dispositivo fisico è l'impostazione di onDisappear su View2 che ripristina il flag attivo. È una soluzione marginalmente più pulita per un bug Xcode (perché non è necessario associarsi a uno stato che View2 non dovrebbe conoscere). NavigationViewDemo_View2 (). OnDisappear (eseguire: {self.isActive = false})
SJoshi

@SJoshi L'ho preso ma onDisappear verrà chiamato dopo isActiveè falso, quindi NavigationView non funzionerà correttamente. È una soluzione temporanea per gli emulatori solo perché NavigationView funziona correttamente sui dispositivi. Nelle versioni precedenti di emulatori NavigationView ha funzionato spero che verrà risolto in futuro emulatore.
Victor Kushnerov,

Stranamente, questo codice non funziona sul mio simulatore O dispositivo fisico: la soluzione che ho proposto reimposta il flag attivo quando la vista di dettaglio viene ignorata e consente al dispositivo fisico di funzionare. La parola per strada è che Xcode 13.4 risolve questo problema
SJoshi

Ho testato sul simulatore 11.3.1 funziona come un incantesimo. Vedi 3 inizi suppongo che anche altri abbiano aiutato.
Victor Kushnerov,

Sì, anche io, ci ho provato su questo - usando più iPhone. Inoltre, testato su 4 dispositivi fisici - nessuna fortuna. Questo bug è sicuramente ridicolo. Nel frattempo ho finito per fare una soluzione ridicola per il simulatore.
SJoshi,


1

Come @ Александр Грабовский ha detto che sembra un bug Xcode 11.3, sto riscontrando lo stesso problema, è necessario eseguire il downgrade o utilizzare una soluzione alternativa come il pulsante Indietro personalizzato come di seguito

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)
            }
        }
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.