В моем приложении 4 представления (назовем их View_A [root] - ›View_B -› View_C - ›View_D). Навигация между ними производилась с помощью NavigationView / NavigationLink.
Когда я вызываю self.presentationMode.wrappedValue.dismiss () из последнего представления (View_D), я ожидаю, что он отклонит только текущее представление (D), но по какой-то причине он отклонил ВСЕ представления и остановился в представлении A (корневом представлении).
Это странно. Я потратил пару часов, пытаясь выяснить, что там происходит, и обнаружил, что - если я удалю ForEach из View_A, он будет работать правильно, и будет отклонено только последнее представление. Хотя ForEach получает только 1 статическое изображение объект в этом примере.
Вторая странность в том, что
- если я не изменю self.thisSession.stats на false, он также будет работать правильно, отклоняя только последнее представление.
Это очень странно, поскольку View_A (насколько я понимаю) не зависит от переменной среды thisSession.
Есть идеи, как предотвратить отклонение View_C и View_B в этом случае? Я хочу попасть в View_C после нажатия на ссылку, а не в View_A.
Любая помощь приветствуется, мне потребовалось время, чтобы узнать, откуда она приходит, но я недостаточно умен, чтобы продолжить;)
import SwiftUI
struct A_View: View {
@EnvironmentObject var thisSession: CurrentSession
var body: some View {
NavigationView {
VStack {
Text("View A")
ForEach([TestObject()], id: \.id) { _ in
NavigationLink(destination: View_B() ) {
Text("Move to View B")
}
}
}
}
}
}
struct View_B: View {
var body: some View {
NavigationView {
NavigationLink(destination: View_C()
) {
Text("GO TO VIEW C")
}
}
}
}
struct View_C: View {
var body: some View {
ZStack {
NavigationView {
NavigationLink(destination: View_D()) {
Text("GO TO VIEW D")
}
}
}
}
}
struct View_D: View {
@EnvironmentObject var thisSession: CurrentSession
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
var body: some View {
ZStack {
VStack {
Button(action: {
self.thisSession.stats = false
self.presentationMode.wrappedValue.dismiss()
}) {
Text("Return!")
}
}
}
}
}
class CurrentSession: ObservableObject {
@Published var stats: Bool = false
@Published var user: String = "user"
}
struct TestObject: Identifiable, Codable {
let id = UUID()
}