Swift中如何将图片保存到UserDefaults?附代码转换报错问题
如何在Swift中将图片保存到UserDefaults?
我尝试用以下代码将图片保存到UserDefaults,但提示无法将其转换为NSUserDefault,想请教正确的实现方式:
@IBAction func CheckBoxTuesdayButtonPressed(_ sender: Any) { if CheckBoxTuesday.image == UIImage(imageLiteralResourceName: "CheckmarkButtonPressed"){ CheckBoxTuesday.image = UIImage(imageLiteralResourceName: "CheckBoxButton") } else{ CheckBoxTuesday.image = UIImage(imageLiteralResourceName: "CheckmarkButtonPressed") UserDefaults.standard.setValue(CIImage.self, forKey: "TuesdayChecked") } }
UserDefaults不能直接存储UIImage或CIImage实例,必须先将图片转换为Data类型才能保存。以下是具体实现方案:
1. 保存图片到UserDefaults
将目标图片转成PNG或JPEG格式的二进制数据,再存入UserDefaults:
// 以选中状态的图片为例 if let targetImage = UIImage(imageLiteralResourceName: "CheckmarkButtonPressed"), let imageData = targetImage.pngData() { // 若用JPEG可替换为jpegData(compressionQuality: 1.0) UserDefaults.standard.set(imageData, forKey: "TuesdayChecked") }
2. 从UserDefaults读取图片
取出存储的二进制数据,再转换回UIImage:
if let savedData = UserDefaults.standard.data(forKey: "TuesdayChecked"), let savedImage = UIImage(data: savedData) { CheckBoxTuesday.image = savedImage }
修正你的完整代码
同时补充取消选中时的存储清理逻辑:
@IBAction func CheckBoxTuesdayButtonPressed(_ sender: Any) { let checkedImage = UIImage(imageLiteralResourceName: "CheckmarkButtonPressed") let uncheckedImage = UIImage(imageLiteralResourceName: "CheckBoxButton") if CheckBoxTuesday.image == checkedImage { CheckBoxTuesday.image = uncheckedImage UserDefaults.standard.removeObject(forKey: "TuesdayChecked") // 取消选中时移除对应存储 } else { CheckBoxTuesday.image = checkedImage if let imageData = checkedImage.pngData() { UserDefaults.standard.set(imageData, forKey: "TuesdayChecked") } } }
更优建议:用布尔值管理选中状态
直接存储图片会占用不必要的存储空间,更高效的方式是存储选中状态的布尔值,再根据状态设置图片:
@IBAction func CheckBoxTuesdayButtonPressed(_ sender: Any) { let isChecked = UserDefaults.standard.bool(forKey: "isTuesdayChecked") let checkedImage = UIImage(imageLiteralResourceName: "CheckmarkButtonPressed") let uncheckedImage = UIImage(imageLiteralResourceName: "CheckBoxButton") if isChecked { CheckBoxTuesday.image = uncheckedImage UserDefaults.standard.set(false, forKey: "isTuesdayChecked") } else { CheckBoxTuesday.image = checkedImage UserDefaults.standard.set(true, forKey: "isTuesdayChecked") } }
内容的提问来源于stack exchange,提问作者Nathan A
相关产品推荐
相关产品推荐

