我目前正在开发一款使用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?
        }
    }
}

我也试图把它作为一个全局变量,但这可能会导致导航在所有场景之间共享,这不是我的意图.

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 = []
        }
    }
}

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

推荐答案

使用@Binding的方式与将写访问权限传递给任何其他类型的@State的方式相同.尽量不要用对象来解决问题,这会导致错误.

Ios相关问答推荐

PieChartView未以编程方式显示在屏幕上

ITMS—91053:Flutter Project中缺少API声明

ScrollViewReader Scrollto Not Working

Xcode 15模拟器用x86_64编译

ionic 4 - 编译 ios - 来自项目Pods的目标GoogleDataTransport中的问题

SwiftUI 每秒从 Timer 更新单个 @State 属性,每秒也重绘整个视图

在 Swift 中 @MainActor 似乎被 withCheckedContinuation 而不是其他异步调用继承是巧合吗?

CoreML 不能并发(多线程)工作?

如何在 SwiftUI 中对表格行使用 Transferable

使用 Foundation 解压缩文件

如何在 SwiftUI 中将选项卡放在滚动视图中?

无法初始化 FirebaseApp - Flutter

界面生成器中 UIView 的边框 colored颜色 不起作用?

从 NSUserDefaults 字典 iOS 中删除所有键

在 iPhone 应用程序中使用 SSL - 出口合规性

使用 Chrome DevTools 调试 iOS 6+7 Mobile Safari

如何识别导航堆栈中的前一个视图控制器

如何找到 UILabel 的实际行数?

如何使用 presentModalViewController 创建透明视图

未找到符号:kUTTypeImage