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
相关产品推荐
相关产品推荐

