如何导航回另一个视图?
How to navigate back and to another view?
我有 3 个视图:A(主视图)、B 和 C。从 ViewA 可以导航到 ViewB 或 ViewC,而 B 和 C 只能自行关闭,如下面的“图表”所示:
A
/ \
B C
根据 ViewB 中发生的情况,我想返回 ViewA 并打开 ViewC。我尝试在 ViewB 中将状态变量作为绑定发送。
NavigationLink(destination: B_View(locations: self.$showC), isActive: $showB) { EmptyView() }
这样,当我需要时,我可以在 ViewB 中切换 showC
,结果如下:
- 视图 B 已关闭
- 视图C被推送显示
- 视图 C 也被关闭了:(
我应该怎么做才能让 ViewC 不被自动关闭?
这是一个可能的解决方案演示。使用 Xcode 12.4 / iOS 14.4.
准备和测试
想法是在根视图端控制导航,因为修改时 NavigationView 内部状态的变化似乎很混乱。
class NavRouteModel: ObservableObject {
@Published var currentTag: Int?
}
struct TestNavigationTriangle: View {
@StateObject private var vm = NavRouteModel()
var body: some View {
NavigationView {
VStack {
NavigationLink("ViewB", destination: ViewB {
self.vm.currentTag = 0
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.vm.currentTag = 2
}
}, tag: 1, selection: $vm.currentTag)
NavigationLink("ViewC", destination: Text("ViewC"), tag: 2, selection: $vm.currentTag)
}
}
}
}
struct ViewB: View {
var completed: () -> () = {}
var body: some View {
Button("Complete & Go to ViewC", action: completed)
}
}
我有 3 个视图:A(主视图)、B 和 C。从 ViewA 可以导航到 ViewB 或 ViewC,而 B 和 C 只能自行关闭,如下面的“图表”所示:
A
/ \
B C
根据 ViewB 中发生的情况,我想返回 ViewA 并打开 ViewC。我尝试在 ViewB 中将状态变量作为绑定发送。
NavigationLink(destination: B_View(locations: self.$showC), isActive: $showB) { EmptyView() }
这样,当我需要时,我可以在 ViewB 中切换 showC
,结果如下:
- 视图 B 已关闭
- 视图C被推送显示
- 视图 C 也被关闭了:(
我应该怎么做才能让 ViewC 不被自动关闭?
这是一个可能的解决方案演示。使用 Xcode 12.4 / iOS 14.4.
准备和测试想法是在根视图端控制导航,因为修改时 NavigationView 内部状态的变化似乎很混乱。
class NavRouteModel: ObservableObject {
@Published var currentTag: Int?
}
struct TestNavigationTriangle: View {
@StateObject private var vm = NavRouteModel()
var body: some View {
NavigationView {
VStack {
NavigationLink("ViewB", destination: ViewB {
self.vm.currentTag = 0
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.vm.currentTag = 2
}
}, tag: 1, selection: $vm.currentTag)
NavigationLink("ViewC", destination: Text("ViewC"), tag: 2, selection: $vm.currentTag)
}
}
}
}
struct ViewB: View {
var completed: () -> () = {}
var body: some View {
Button("Complete & Go to ViewC", action: completed)
}
}