从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中,它更可能是两个独立的问题。它很有效,非常感谢!