Swift开发个人ADHD管理工具时UserDefaults数据持久化不生效求助
问题根因与修复方案
你代码中的问题集中在3个点,按影响优先级排序如下:
- init逻辑存在致命错误:读取Purchases的分支执行完成后直接return,无论解码是否成功,后续读取Prices的代码永远不会被执行,导致Price数据根本无法从UserDefaults加载。
- 不能在init方法中给@State属性赋值:@State的存储由SwiftUI框架外部管理,初始化阶段的赋值会被属性声明时的默认空数组覆盖,导致你读取到的持久化数据直接丢失。
- 数据变更操作未完整触发持久化:删除条目、清空列表的操作只修改了内存中的数组,没有调用保存方法同步到UserDefaults,这部分修改重启应用后会丢失。
具体修改步骤
1. 删除原有的init方法,将数据读取逻辑移到onAppear中
在body的最外层容器(你代码中的ZStack)上添加onAppear modifier,替换原init的读取逻辑:
ZStack { // 原有ZStack内的代码不变 } .onAppear { // 读取消费条目 if let data = UserDefaults.standard.data(forKey: "Purchases"), let decoded = try? JSONDecoder().decode([Purchases].self, from: data) { self.purchases = decoded } // 读取价格数据 if let data = UserDefaults.standard.data(forKey: "Bread"), let decoded = try? JSONDecoder().decode([Price].self, from: data) { self.prices = decoded } }
2. 给删除、清空方法添加保存逻辑
修改对应方法,数据变更后同步到UserDefaults:
func deleteItem(at offsets: IndexSet){ purchases.remove(atOffsets: offsets) saveStuff() // 新增保存调用 } func deletePrice(at offsets: IndexSet){ prices.remove(atOffsets: offsets) saveBread() // 新增保存调用 } func clearList(){ self.prices.removeAll() self.purchases.removeAll() saveStuff() // 新增保存调用 saveBread() // 新增保存调用 }
3. 可选优化:简化添加方法的冗余保存逻辑
你当前的addItem、addPrice方法里前后调用了两次保存,删掉第一次的即可,不会影响功能:
func addItem(){ self.purchases.append(Purchases(name: purchase)) saveStuff() purchase = "" } func addPrice(){ self.prices.append(Price(name: price)) saveBread() price = "" }
内容的提问来源于stack exchange,提问作者MixedByInstinct
相关产品推荐
相关产品推荐

