0

我需要一个可选的@AppStorage字符串属性(用于NavigationLink选择,需要可选),所以我声明

@AppStorage("navItemSelected") var navItemSelected: String?

我需要它以非零的默认值开始,所以我尝试了:

@AppStorage("navItemSelected") var navItemSelected: String? = "default"

但这不会编译。

我也试过:

init() {
    if navItemSelected == nil { navItemSelected = "default" }
}

但这只会在应用程序启动时覆盖实际的持久值。

有没有办法用默认的非零值启动它,然后让它像往常一样持续存在?

4

2 回答 2

0

这是基于内联的可能方法的简单演示Binding(跟进我上面的评论)。

使用 Xcode 13 / iOS 15 测试

演示

struct DemoAppStoreNavigation: View {
    static let defaultNav = "default"
    @AppStorage("navItemSelected") var navItemSelected = Self.defaultNav

    var body: some View {
        NavigationView {
            Button("Go Next") {
                navItemSelected = "next"
            }.background(
                NavigationLink(isActive: Binding(
                    get: { navItemSelected != Self.defaultNav },
                    set: { _ in }
                ), destination: {
                    Button("Return") {
                        navItemSelected = Self.defaultNav
                    }
                    .onDisappear {
                        navItemSelected = Self.defaultNav   // << for the case of `<Back`
                    }
                }) { EmptyView() }
            )
        }
    }
}
于 2021-10-26T16:51:08.637 回答
0

@AppStorage是 的包装器UserDefaults,因此您可以简单地以老式方式注册默认值:

UserDefaults.standard.register(defaults: ["navItemSelected" : "default"])

您需要在视图加载register(defaults:) 之前调用它,所以我建议您在应用程序的 init 或application(_:didFinishLaunchingWithOptions:).

于 2021-10-27T15:00:58.450 回答