SwiftUI 导航到 NavigationView 堆栈的底部 [英] SwiftUI navigate to bottom of NavigationView stack

查看:20
本文介绍了SwiftUI 导航到 NavigationView 堆栈的底部的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下设置,其中父视图包含一个 NavigationView,它显示一系列页面,A、B 和 C.在页面 C 上有一个隐藏导航视图的按钮.我想要它,以便在再次显示导航视图时,它会自动导航到页面 A,但是我不确定如何使用 SwiftUI 执行此操作,如何实现?

I have the following set up where a parent view holds a NavigationView which displays a series of pages, A, B and C. On page C there is a button which hides the navigation view. I want to have it so that when the navigation view is shown again, it automatically navigates to page A, however I am unsure how to do this with SwiftUI, how can this be achieved?

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

推荐答案

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

The setting here is not complicated. One thing is for any intermediate view, you have to set .isDetailLink(false). Otherwise, they will be kept during rewinding.

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

这篇关于SwiftUI 导航到 NavigationView 堆栈的底部的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆