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

iOS开发:UICollectionView按钮点击存储数据至NSUserDefaults问题及键值检查

正确实现UserDefaults存储逻辑与键值检查方案

Hey there! Let's sort out your code and answer both of your questions clearly:

一、修复并实现点击按钮的存储逻辑

Your original code has a few small issues (like a typo and missing the step to save the updated array back to UserDefaults) plus uses a deprecated API. Here's the corrected, up-to-date version:

@IBAction func saveButtonTapped(_ sender: UIButton) {
    // 1. 处理图片数据(使用iOS 11+的新API替代废弃的UIImageJPEGRepresentation)
    guard let image = imageView.image, let imageData = image.jpegData(compressionQuality: 1.0) else {
        // 如果图片为空,可根据需求做提示或跳过存储
        print("Image is nil, can't save")
        return
    }
    
    // 2. 组装要存储的字典数据
    let newCarData: [String: Any] = [
        "name": nameLbl.text ?? "",
        "price": costLbl.text ?? "",
        "image": imageData
    ]
    
    // 3. 从UserDefaults获取现有数组,若不存在则初始化空数组
    var carArray = UserDefaults.standard.array(forKey: "car") as? [[String: Any]] ?? []
    
    // 4. 添加新数据到数组
    carArray.append(newCarData)
    
    // 5. 将更新后的数组存回UserDefaults(这一步是原代码缺失的关键!)
    UserDefaults.standard.set(carArray, forKey: "car")
    UserDefaults.standard.synchronize() // 可选:确保立即写入,iOS 10+后系统会自动处理,但手动调用也没问题
}

关键注意点:

  • 修复拼写错误:原代码里的maAr是mArray的笔误,会导致编译错误
  • 初始化空数组:用?? []确保即使UserDefaults里没有"car"键,也能得到一个空数组,避免append时崩溃
  • 替换废弃API:UIImageJPEGRepresentation已被弃用,改用jpegData(compressionQuality:)
  • 必须存回UserDefaults:修改数组后一定要调用set(_:forKey:),否则修改不会持久化

二、检查UserDefaults中指定键的值是否存在

There are two scenarios you might want to check: whether the key exists at all, or whether the key exists and has non-empty data.

1. 检查键是否存在(不管值是不是空)

if UserDefaults.standard.object(forKey: "car") != nil {
    print("The 'car' key exists in UserDefaults")
} else {
    print("The 'car' key does NOT exist")
}

2. 检查键存在且对应数组非空

如果需要确保数组里有实际数据,可以这样判断:

if let carArray = UserDefaults.standard.array(forKey: "car") as? [[String: Any]], !carArray.isEmpty {
    print("'car' key exists and has non-empty data")
} else {
    print("'car' key doesn't exist or the array is empty")
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:11:32