【问题标题】:Initialize optional @AppStorage property with non-nil value使用非零值初始化可选的 @AppStorage 属性
【发布时间】:2021-10-26 16:25:17
【问题描述】:

我需要一个可选的@AppStorage String 属性(对于NavigationLink 选择,它需要可选),所以我声明了

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

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

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

但这不会编译。

我也试过了:

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

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

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

【问题讨论】:

  • Optional 不是 plist 类型,因此无法存储在 AppStorage 中,您需要在 NavigationLink 端解决此问题,例如引入内联 Binding 检查 AppStorage 的条件值。

标签: swiftui property-wrapper appstorage


【解决方案1】:

这是一个基于内联 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() }
            )
        }
    }
}

【讨论】:

    【解决方案2】:

    @AppStorageUserDefaults 的包装器,因此您可以简单地以老式方式注册一个默认值:

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

    您需要在视图加载之前调用register(defaults:),因此我建议您在应用的初始化或application(_:didFinishLaunchingWithOptions:) 中调用它。

    【讨论】:

      猜你喜欢
      • 2021-10-05
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多