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

