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
我的应用程序有 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