Минимальный воспроизводимый пример (бета-версия Xcode 11.2, работает в 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 или ожидаемое поведение?
РЕДАКТИРОВАТЬ: Я открыл проблему с Apple в их помощник обратной связи с идентификатором FB7423964
на случай, если кто-то из Apple хочет весить :).
РЕДАКТИРОВАТЬ: мой открытый билет в помощнике обратной связи указывает, что есть более 10 аналогичных зарегистрированных проблем. Они обновили разрешение с Resolution: Potential fix identified - For a future OS update
. Скрестим пальцы, что починка скоро приземлится.
РЕДАКТИРОВАТЬ: Это было исправлено в iOS 13.3!
ContentView.swift
. Я внесу изменения в сообщение, но сбой происходит только при переходе вперед, а затем назад.