SwiftUI 导航到 NavigationView 堆栈的底部

标签 swiftui reset navigationview

我进行了以下设置,其中父 View 包含一个 NavigationView,它显示一系列页面 A、B 和 C。在页面 C 上有一个隐藏导航 View 的按钮。我想要它,以便当再次显示导航 View 时,它会自动导航到页面 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

最佳答案

这里的设置并不复杂。一件事是对于任何中间 View ,您都必须设置 .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")
            }
        }
    }
}

关于SwiftUI 导航到 NavigationView 堆栈的底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59200936/

相关文章:

条件 subview 的 SwiftUI 转换

仅适用于#widget 的 CSS 重置

wpf - TabControl 在 Window.Show 上丢失选定的选项卡

gradle - 导航 View 应用程序:菜单构建gradle错误

ios - SwiftUI:在 iOS 14 中应用 `Text.init(_:style:)` 时, `.cornerRadius` 不会自动更新

swiftui - SwiftUI Picker onChange或等效版本?

php - ERR_CONNECTION_RESET 与 PHP 脚本

android - NavigationView OnNavigationItemSelectedListener 未被调用

android - 如何在 onClick 期间动态地用另一个菜单膨胀 android NavigationView?

swift - 如何在 SwiftUI 中实现多行 TextView