PresentationMode.dismiss 在 ForEach 中使用多个 NavigationLinks 时的奇怪行为

PresentationMode.dismiss weird behaviour when using multiple NavigationLinks inside ForEach

我的应用程序有 4 个视图(我们称它们为 View_A[root] -> View_B -> View_C -> View_D)。它们之间的导航是使用 NavigationView/NavigationLink.

进行的

当我从最后一个视图 (View_D) 调用 self.presentationMode.wrappedValue.dismiss() 时,我希望它仅关闭当前视图 (D),但是由于某种原因,它取消了所有视图并停在视图 A(根视图)。

这很奇怪。 我花了几个小时试图弄清楚那里发生了什么,我发现 - 如果我从“View_A”中删除“ForEach”,它会正常工作,并且只有最后一个视图被关闭。即使 ForEach 在这个例子中只获得 1 个静态对象。

第二个奇怪的是

- 如果我不将“self.thisSession.stats”更改为 false,它也可以正常工作,仅关闭最后一个视图。

这太奇怪了,因为 View_A(据我所知)不依赖于 thisSession 环境变量。

关于如何防止 View_C 和 View_B 在这种情况下被驳回的任何想法?我想在点击 link 后到达 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()
}

您的问题在于:

NavigationView

整个视图堆栈中应该只有一个NavigationView。尝试从视图 B 和 C

中删除 NavigationView