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

从SwiftUI中的导航堆栈中删除屏幕,swiftui,swiftui-navigationlink,swiftui-navigationview,Swiftui,Swiftui Navigationlink,Swiftui Navigationview,我正在使用NavigationLink在NavigationView中导航屏幕。 如何从导航堆栈中删除屏幕? 不只是隐藏导航“后退”按钮,而是完全从堆栈中删除屏幕 例如,我有这样的屏幕链:A->B->C 如何删除屏幕B以从C返回到A 或者,另一个例子,如何删除屏幕A和B,使C屏幕成为根屏幕 或者所有这些都是SwiftUI的概念所无法做到的?对于您的第一个问题(从C到A),这通常被称为“跳转到根目录”,这里有许多解决方案,包括: 您的第二个问题(将A替换为C作为根视图)有点不同。可以通过将视图层次

我正在使用
NavigationLink
NavigationView
中导航屏幕。 如何从导航堆栈中删除屏幕? 不只是隐藏导航“后退”按钮,而是完全从堆栈中删除屏幕

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

或者,另一个例子,如何删除屏幕
A
B
,使
C
屏幕成为根屏幕


或者所有这些都是SwiftUI的概念所无法做到的?

对于您的第一个问题(从
C
A
),这通常被称为“跳转到根目录”,这里有许多解决方案,包括:

您的第二个问题(将
A
替换为
C
作为根视图)有点不同。可以通过将视图层次结构中的
A
替换为
C
来实现这一点。为了做到这一点,您需要有某种方式与父视图通信——我选择了一个简单的
@State
/
@Binding
来实现这一点,但是可以使用
observeObject
甚至回调函数

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


请不要在一篇文章中提出多个问题,这会让你和其他人更难找到正确答案,以便使用你的问题进行学习或研究。公平地说,如果从UIKit的角度来看,这将是一个概念。恰好在SwiftUI中,它更可能是两个独立的问题。它很有效,非常感谢!