Мінімальний приклад відтворення (Xcode 11.2 beta, це працює в 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()
}
}
Здається, проблема полягає в тому, щоб помістити мою NavigationLink
внутрішню частину navigationBarItems
модифікатора, який вкладений всередині перегляду SwiftUI, корінь якого - це NavigationView
. Звіт про збій вказує на те, що я намагаюся перейти на контролер перегляду, який не існує, коли я переходжу вперед, Child
а потім назад до Parent
.
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Tried to pop to a view controller that doesn't exist.'
*** First throw call stack:
Якби я замість цього розмістив NavigationLink
у тілі виду, як показано нижче, це працює чудово.
struct Parent: View {
var body: some View {
NavigationView {
NavigationLink(destination: Child(), label: { Text("Next") })
}
}
}
Це помилка SwiftUI чи очікувана поведінка?
EDIT: Я відкрив проблему з Apple, їх помічником із зворотним зв'язком з ідентифікатором, FB7423964
на випадок, якщо хтось із Apple захоче зважити :).
EDIT: Мій відкритий квиток у помічнику зворотного зв’язку вказує на 10+ подібних повідомлених проблем. Вони оновили резолюцію на Resolution: Potential fix identified - For a future OS update
. Пальці схрестили, що виправлення приземляється незабаром.
EDIT: Це було виправлено в iOS 13.3!
ContentView.swift
. Я буду редагувати публікацію, але аварія трапляється лише тоді, коли ви перейдете вперед, а потім назад.