Esempio riproducibile minimo (Xcode 11.2 beta, funziona in Xcode 11.1):
struct Parent: View {
var body: some View {
NavigationView {
Text("Hello World")
.navigationBarItems(
trailing: NavigationLink(destination: Child(), label: { Text("Next") })
)
}
}
}
struct Child: View {
@Environment(\.presentationMode) var presentation
var body: some View {
Text("Hello, World!")
.navigationBarItems(
leading: Button(
action: {
self.presentation.wrappedValue.dismiss()
},
label: { Text("Back") }
)
)
}
}
struct ContentView: View {
var body: some View {
Parent()
}
}
Il problema sembra risiedere nel posizionare il mio NavigationLink
interno di un navigationBarItems
modificatore nidificato all'interno di una vista SwiftUI la cui vista radice è a NavigationView
. Il rapporto sugli arresti anomali indica che sto tentando di visualizzare un controller di visualizzazione che non esiste quando navigo avanti Child
e poi di nuovo Parent
.
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Tried to pop to a view controller that doesn't exist.'
*** First throw call stack:
Se dovessi invece posizionarlo NavigationLink
nel corpo della vista come il seguente, funziona perfettamente.
struct Parent: View {
var body: some View {
NavigationView {
NavigationLink(destination: Child(), label: { Text("Next") })
}
}
}
È un bug di SwiftUI o un comportamento previsto?
EDIT: ho aperto un problema con Apple nel loro assistente di feedback con l'ID FB7423964
nel caso in cui qualcuno di Apple si preoccupi di pesare :).
EDIT: il mio ticket aperto nell'assistente di feedback indica che ci sono più di 10 problemi simili segnalati. Hanno aggiornato la risoluzione con Resolution: Potential fix identified - For a future OS update
. Le dita incrociarono che la correzione atterra presto.
EDIT: questo è stato risolto in iOS 13.3!
ContentView.swift
. Apporterò una modifica al post, ma l'incidente si verifica solo quando navighi avanti e poi indietro.