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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:20:07