swiftui - 从 SwiftUI 中的导航堆栈中删除屏幕

标签 swiftui swiftui-navigationlink swiftui-navigationview

我正在使用 NavigationLinkNavigationView 中导航屏幕.
如何从导航堆栈中删除屏幕?
不只是隐藏导航“返回”按钮,而是从堆栈中完全删除屏幕?
例如,我有这样的屏幕链:A -> B -> C如何移除屏幕 BC 回去至 A ?
或者,另一个例子,如何移除屏幕 AB ,所以 C屏幕将是根?
或者这一切都不是 SwiftUI 的概念?

最佳答案

就您的第一个问题(从 CA )而言,这通常被称为“弹出到根”,并且在 SO 上有许多解决方案,包括:https://stackoverflow.com/a/59662275/560942
您的第二个问题(将 A 替换为 C 作为根 View )有点不同。您可以通过替换 A 来做到这一点。与 C在 View 层次结构中。为了做到这一点,您需要有某种方式与父 View 进行通信——我选择了一个简单的 @State/@Binding要做到这一点,但可以使用 ObservableObject甚至回调函数。

enum RootView {
    case A, C
}

struct ContentView : View {
    @State private var rootView : RootView = .A
    
    var body: some View {
        NavigationView {
            switch rootView {
            case .A:
                ViewA(rootView: $rootView)
            case .C:
                ViewC(rootView: $rootView)
            }
        }.navigationViewStyle(StackNavigationViewStyle())
    }
}

struct ViewA : View {
    @Binding var rootView : RootView
    
    var body: some View {
        VStack {
            Text("View A")
            NavigationLink(destination: ViewB(rootView: $rootView)) {
                Text("Navigate to B")
            }
        }
    }
}

struct ViewB : View {
    @Binding var rootView : RootView
    
    var body: some View {
        VStack {
            Text("View B")
            NavigationLink(destination: ViewC(rootView: $rootView)) {
                Text("Navigate to C")
            }
            Button(action: {
                rootView = .C
            }) {
                Text("Navigate to C as root view")
            }
        }
    }
}

struct ViewC : View {
    @Binding var rootView : RootView
    
    var body: some View {
        VStack {
            Text("View C")
            switch rootView {
            case .A:
                Button(action: {
                    rootView = .C
                }) {
                    Text("Switch this to the root view")
                }
            case .C:
                Text("I'm the root view")
            }
        }
    }
}

关于swiftui - 从 SwiftUI 中的导航堆栈中删除屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67128142/

相关文章:

swiftui - 静态方法 'buildBlock' 要求 'Button<Any>.Type' 符合 'View'

SwiftUI 使用 INFO 按钮列出行

swift - 我必须沮丧还是我错过了什么?

ios - 使用 SwiftUI 从结构中的完成变量调用方法

swift - 如何在struct中实现func计算?

ios - 弹出式导航的导航在SwiftUI中不起作用?

SwiftUI 有条件地定义 NavigationLink 目的地

ios - 在 SwiftUI 的列表行(TableviewCell)中单击按钮导航到详细 View

swiftui - NavigationView 后退按钮不显示

ios - SwiftUI 文本字段文本颜色问题