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

Swift:如何将自定义CheckBox(UIButton子类)状态保存到UserDefaults?

解决自定义CheckBox重启后状态不保留的问题

我正在开发一款需要清单功能的应用,已基于UIButton创建自定义CheckBox类实现复选框功能,运行正常,但重启应用后复选框状态无法保留。需要修改代码,将按钮状态存入UserDefaults,实现重启应用后恢复状态。

原代码

import UIKit

class CheckBox: UIButton {
    
    //images
    let checkedImage = UIImage(named: "checkedd_checkbox")
    let unCheckedImage = UIImage(named: "uncheckedd_checkbox")
    
    //bool propety
    @IBInspectable var isChecked:Bool = false{
        didSet{
            self.updateImage()
        }
    }

    
    override func awakeFromNib() {
       self.addTarget(self, action: #selector(CheckBox.buttonClicked), for: UIControl.Event.touchUpInside)
       self.imageView?.contentMode = .scaleAspectFit
       self.imageEdgeInsets = UIEdgeInsets(top: 5.0, left: 0.0, bottom: 5.0, right: 50.0)
       self.updateImage()
    }
    
    
    func updateImage() {
        if isChecked == true{
            self.setImage(checkedImage, for: [])
        }else{
            self.setImage(unCheckedImage, for: [])
        }

    }

    @objc func buttonClicked(sender:UIButton) {
        if(sender == self){
            isChecked = !isChecked
        }
    }

}

修改后的代码(实现状态持久化)

import UIKit

class CheckBox: UIButton {
    
    // 复选框图片
    let checkedImage = UIImage(named: "checkedd_checkbox")
    let unCheckedImage = UIImage(named: "uncheckedd_checkbox")
    
    // 用于UserDefaults存储的唯一标识,可在Storyboard中设置
    @IBInspectable var userDefaultsKey: String = "" {
        didSet {
            // 设置key后立即从UserDefaults读取状态
            if !userDefaultsKey.isEmpty {
                isChecked = UserDefaults.standard.bool(forKey: userDefaultsKey)
            }
        }
    }
    
    // 复选框状态
    @IBInspectable var isChecked: Bool = false {
        didSet {
            updateImage()
            // 仅当key有效时,将状态存入UserDefaults
            if !userDefaultsKey.isEmpty {
                UserDefaults.standard.set(isChecked, forKey: userDefaultsKey)
            }
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        self.addTarget(self, action: #selector(buttonClicked), for: .touchUpInside)
        self.imageView?.contentMode = .scaleAspectFit
        self.imageEdgeInsets = UIEdgeInsets(top: 5.0, left: 0.0, bottom: 5.0, right: 50.0)
        
        // 从UserDefaults恢复状态(如果已设置key)
        if !userDefaultsKey.isEmpty {
            isChecked = UserDefaults.standard.bool(forKey: userDefaultsKey)
        } else {
            updateImage()
        }
    }
    
    func updateImage() {
        setImage(isChecked ? checkedImage : unCheckedImage, for: [])
    }

    @objc func buttonClicked(sender: UIButton) {
        guard sender == self else { return }
        isChecked = !isChecked
    }
}

关键修改说明

  • 新增userDefaultsKey属性:这是每个复选框的唯一标识,必须在Storyboard或代码中为每个CheckBox设置不同的key(比如"task1_checkbox"、"task2_checkbox"),避免状态互相覆盖。
  • 改造isChecked的didSet:更新图片的同时,将状态写入UserDefaults,只有当userDefaultsKey不为空时才执行存储操作。
  • 调整awakeFromNib逻辑:从UserDefaults读取对应key的状态,初始化isChecked,实现重启后的状态恢复。
  • 简化代码逻辑:用三元运算符优化updateImage,用guard语句精简点击事件判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:45:42