首页 > 解决方案 > 使用非零值初始化可选的 @AppStorage 属性

问题描述

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

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

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

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

但这不会编译。

我也试过:

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

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

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

标签: swiftuiproperty-wrapperappstorage

解决方案


这是基于内联的可能方法的简单演示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() }
            )
        }
    }
}

推荐阅读