在SwiftUI中从导航栈中移除屏幕

8

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

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

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

或者,所有这些都无法在SwiftUI的概念下实现吗?


请翻译以下关于编程的内容,将翻译后的文本返回:请不要在一篇帖子中询问多个问题,这会使为您寻找正确答案变得更加困难,同时也会让其他人利用您的问题学习或研究。 - ios coder
公平的说,如果从UIKit的角度来看,这将是一个概念。只不过在SwiftUI中,很可能是两个单独的问题。 - jnpdx
2个回答

5
关于第一个问题(从 C 到 A),这通常称为“跳转到根”,在 SO 上有多种解决方案,包括:https://dev59.com/21MH5IYBdhLWcg3w_Wd_#59662275 第二个问题(将 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")
            }
        }
    }
}


1

SwiftUI 中有一个名为 NavigationStack 的新元素,它允许您以任何您想要的方式操作堆栈。我已经在演示项目中进行了尝试,并试图以可维护和程序化的方法在 SwiftUI 中使用协调器。


1
很遗憾,它仅支持 iOS 16 或更高版本 :) - badadin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接