如何导航回另一个视图?

时间:2021-02-14 11:42:43

标签: swiftui swiftui-navigationlink

我有 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 被自动关闭?

1 个答案:

答案 0 :(得分:2)

这是可能的解决方案的演示。使用 Xcode 12.4 / iOS 14.4 进行准备和测试。

这个想法是在根视图端控制导航,因为 NavigationView 内部状态的变化似乎被修改的时刻混淆了。

demo

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)
    }
}