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

Swift开发个人ADHD管理工具时UserDefaults数据持久化不生效求助

问题根因与修复方案

你代码中的问题集中在3个点,按影响优先级排序如下:

  1. init逻辑存在致命错误:读取Purchases的分支执行完成后直接return,无论解码是否成功,后续读取Prices的代码永远不会被执行,导致Price数据根本无法从UserDefaults加载。
  2. 不能在init方法中给@State属性赋值:@State的存储由SwiftUI框架外部管理,初始化阶段的赋值会被属性声明时的默认空数组覆盖,导致你读取到的持久化数据直接丢失。
  3. 数据变更操作未完整触发持久化:删除条目、清空列表的操作只修改了内存中的数组,没有调用保存方法同步到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:12:03