You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中UserDefaults调用set后@State变量未同步更新如何解决

问题原因

@State 仅会在视图初始化时读取一次初始值,本身不具备监听 UserDefaults 数据变更的能力,所以你修改 UserDefaults 后,@State 变量不会自动更新,只能手动同步值。

规范解决方案

直接使用 SwiftUI 原生提供的 @AppStorage 属性包装器替换 @State 即可。它是 Apple 专门为绑定 UserDefaults 存储设计的属性包装器,会自动监听对应键值的变更,同时触发视图刷新,不需要你手动维护两边的数值同步。

修改后代码如下:

// 直接绑定UserDefaults中key为userOnboarded的数值,初始值为false
@AppStorage("userOnboarded") var userOnboarded: Bool = false
    
var body: some Scene {
    WindowGroup {
        if userOnboarded {
            Text("PLACEHOLDER: Main App View")
        } else {
            Button(action: {
                // 直接修改该变量就会自动同步写入UserDefaults,同时触发视图切换到主界面
                userOnboarded = true
                print(UserDefaults.standard.bool(forKey: "userOnboarded"))
            }) {
                VStack {
                    Text("Click circle to onboard.")
                    Circle()
                        .foregroundColor(Color.red)
                }
            }
        }
    }
}

补充说明

  • @AppStorage 底层完全基于 UserDefaults 实现,修改属性值会自动写入 UserDefaults,UserDefaults 对应键值被其他逻辑修改时,@AppStorage 也会自动更新属性值并触发视图重绘。
  • 如果你的应用需要兼容 iOS 14 以下的系统版本,可以手动监听 NSUserDefaultsDidChangeNotification 通知,收到通知后更新 @State 变量的值即可。目前绝大多数应用最低兼容版本都已达到 iOS 14,优先使用 @AppStorage 是最简单高效的方案。

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:24:02