SwiftUI 中全局 NavigationPath 的放置位置

whe*_*set 15 ios swift swiftui swiftui-navigationview

我目前正在开发一个使用NavigationStack. 我想知道我应该把NavigationPath变量放在哪里,这样我就可以在任何地方修改它。

我尝试将它作为变量放入根视图中State,但我似乎很难在深度嵌套的视图中修改它。

struct RootView: View {
    @State var path = NavigationPath()
    
    var body: some View {
        NavigationStack(path: $path) {
            // ...
        }
    }
}

struct SubView: View {
    var body: some View {
        Button("Push to root") {
            // how should I access `path` from here?
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我也尝试将其作为全局变量,但这可能会导致导航在所有场景之间共享,这不是我的意图。

class Router: ObservableObject {
    static var shared = Router()
    @Published var path = NavigationPath()
}

struct RootView: View {
    @ObservedObject var router = Router.shared
    
    var body: some View {
        NavigationStack(path: $router.path) {
            // ...
        }
    }
}

struct SubView: View {
    @ObservedObject var router = Router.shared
    
    var body: some View {
        Button("Push to root") {
            router.path = []
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果有人提供可行的设计或任何建议,我将不胜感激。

mal*_*hal 1

使用@Binding与将写访问权限传递给任何其他类型的相同的方法@State。尝试坚持使用 Swift 中的值类型,而不是回退到熟悉的对象来解决问题,这将导致 Swift/SwiftUI 使用值语义来消除一致性错误。

  • 您可以将绑定到“EnvironmentKey”中的路径 (2认同)