SwiftUI导航到NavigationView堆栈的底部

时间:2019-12-05 18:06:10

标签: swiftui reset navigationview

我进行了以下设置,其中父视图包含NavigationView,其中显示了一系列页面A,B和C。在C页面上,有一个按钮隐藏了导航视图。我想拥有它,以便在再次显示导航视图时,它会自动导航到页面A,但是我不确定如何使用SwiftUI做到这一点,如何实现?

struct ParentView: View {
    @State var showNavigation:Bool = true
    var body: some View {
        ZStack {
            Button(action: {
                self.showNavigation = true
            }) {
                Text("Show navigation")
            }
            NavigationView {
                NavigationLink(destination: ChildA(showNavigation: $showNavigation)) {
                    Text("Go to A")
                }
            }.opacity(showNavigation ? 1.0 : 0.0)
        }
    }
}

struct ChildA: View {
    @Binding var showNavigation:Bool

    var body: some View {
        VStack {
            Text("A")
            NavigationLink(destination: ChildB(showNavigation: $showNavigation)) {
                           Text("Go to B")
                       }
        }
    }
}

struct ChildB: View {
    @Binding var showNavigation:Bool

    var body: some View {
        VStack {
            Text("B")
            NavigationLink(destination: ChildC(showNavigation: $showNavigation)) {
                           Text("Go to C")
                       }
        }
    }
}

struct ChildC: View {
    @Binding var showNavigation:Bool

    var body: some View {
        VStack {
            Text("C")
            Button(action: {
                self.showNavigation = false
            }) {
                Text("Hide Navigation")
            }
        }
    }
}

Flow

1 个答案:

答案 0 :(得分:2)

这里的设置并不复杂。对于任何中间视图,一件事是必须设置.isDetailLink(false)。否则,它们将在倒带期间保留。

                    struct ParentView: View {
                    @State var showNavigation:Bool = true
                    @State var isActive:Bool = true
                    var body: some View {
                        ZStack {
                            Button(action: {
                                self.showNavigation = true
                            }) {
                                Text("Show navigation")
                            }
                            NavigationView {
                                NavigationLink.init(destination:  ChildA(showNavigation: $showNavigation, isActive: $isActive ), isActive: $isActive){
                                     Text("Go to A")
                                }
                            }.opacity(showNavigation ? 1.0 : 0.0)
                        }
                    }
                }

                struct ChildA: View {
                    @Binding var showNavigation:Bool
                    @Binding var isActive:Bool
                      @State var isNextActive:Bool = false
                    var body: some View {
                        VStack {
                            Text("A")
                            NavigationLink(destination: ChildB(showNavigation: $showNavigation, isActive: $isNextActive), isActive: $isNextActive) {
                                           Text("Go to B")
                            }.isDetailLink(false)
                        }.onReceive(Just(isNextActive)) { isNextActive in
                            if isNextActive == false && (!self.showNavigation) {

                                                  self.isActive = false
                            }
                        }
                    }
                }

                struct ChildB: View {
                     @Binding var showNavigation:Bool
                     @Binding var isActive:Bool
                     @State var isNextActive:Bool = false
                    var body: some View {
                        VStack {
                            Text("B")
                            NavigationLink(destination: ChildC(showNavigation: $showNavigation, isActive: $isNextActive), isActive: $isNextActive) {
                                           Text("Go to C")
                            }.isDetailLink(false)
                        }.onReceive(Just(isNextActive)) { isNextActive in
                            if isNextActive == false && (!self.showNavigation) {
                                DispatchQueue.main.async {


                                    self.isActive = false}
                            }
                        }

                    }
                }

                struct ChildC: View {
                    @Binding var showNavigation:Bool
                   @Binding var isActive:Bool
                    var body: some View {
                        VStack {
                            Text("C")
                            Button(action: {
                                self.showNavigation = false
                                self.isActive = false
                            }) {
                                Text("Hide Navigation")
                            }
                        }
                    }
                }