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 NavigationLinkinterno di un navigationBarItemsmodificatore 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 Childe 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 NavigationLinknel 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 FB7423964nel 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.