从 SwiftUI 中的导航堆栈中删除屏幕
Remove screen from navigation stack in SwiftUI
我正在使用 NavigationLink
浏览 NavigationView
中的屏幕。
如何从导航堆栈中删除屏幕?
不仅要隐藏导航“后退”按钮,还要从堆栈中完全移除屏幕?
比如我有这样的网链:A -> B -> C
如何删除屏幕 B
以从 C
返回到 A
?
或者,另一个例子,如何删除屏幕 A
和 B
,以便 C
屏幕成为根?
或者这一切在 SwiftUI 的概念下都是不可能的?
关于你的第一个问题(从 C
到 A
),这通常被称为“弹出到 root”并且在 SO 上有许多解决方案,包括:
你的第二个问题(将 A
替换为 C
作为根视图)有点不同。您可以通过在视图层次结构中将 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")
}
}
}
}
我正在使用 NavigationLink
浏览 NavigationView
中的屏幕。
如何从导航堆栈中删除屏幕?
不仅要隐藏导航“后退”按钮,还要从堆栈中完全移除屏幕?
比如我有这样的网链:A -> B -> C
如何删除屏幕 B
以从 C
返回到 A
?
或者,另一个例子,如何删除屏幕 A
和 B
,以便 C
屏幕成为根?
或者这一切在 SwiftUI 的概念下都是不可能的?
关于你的第一个问题(从 C
到 A
),这通常被称为“弹出到 root”并且在 SO 上有许多解决方案,包括:
你的第二个问题(将 A
替换为 C
作为根视图)有点不同。您可以通过在视图层次结构中将 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")
}
}
}
}