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

bad*_*din 8 swiftui swiftui-navigationlink swiftui-navigationview

我用来NavigationLinkNavigationView. 如何从导航堆栈中删除屏幕?不仅隐藏导航“后退”按钮,还从堆栈中完全删除屏幕?

例如,我有这样的屏幕链:A -> B -> C 如何删除屏幕B以返回CA

或者,另一个例子,如何删除 screenAB,这样Cscreen 将成为根?

或者说这一切在 SwiftUI 的构想中都是不可能实现的?

jn_*_*pdx 5

就您的第一个问题(从CA),这通常称为“弹出到根”,并且在此处有许多解决方案,包括:https ://stackoverflow.com/a/59662275/560942

您的第二个问题(替换AC根视图)有点不同。您可以通过在视图层次结构中A替换为来做到这一点。C为了做到这一点,您需要有某种方式与父视图进行通信——我选择了一个简单的@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")
            }
        }
    }
}

Run Code Online (Sandbox Code Playgroud)