SwiftUI导航到NavigationView堆栈的底部

SwiftUI导航到NavigationView堆栈的底部,swiftui,reset,navigationview,Swiftui,Reset,Navigationview,我有以下设置,其中父视图包含一个NavigationView,它显示一系列页面,a、B和C。在第C页上有一个按钮隐藏导航视图。我希望这样,当导航视图再次显示时,它会自动导航到页面A,但是我不确定如何使用SwiftUI实现这一点,如何实现这一点 struct ParentView: View { @State var showNavigation:Bool = true var body: some View { ZStack { Butto

我有以下设置,其中父视图包含一个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")
            }
        }
    }
}

这里的设置并不复杂。一件事是对于任何中间视图,都必须设置.isDetailLinkfalse。否则,它们将在复卷期间保留

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

这里的设置并不复杂。一件事是对于任何中间视图,都必须设置.isDetailLinkfalse。否则,它们将在复卷期间保留

                    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")
                            }
                        }
                    }
                }
您可以将isActive添加到NavigationLink以获得对导航堆栈的更多控制。有关更多详细信息,请转至。您可以将isActive添加到NavigationLink以获得对导航堆栈的更多控制。有关更多详细信息,请访问