Swift开发:如何将UISwitch切换状态存入UserDefaults实现持久化存储
问题原因
- 每次视图加载时都会用初始值
true覆盖UserDefaults里已存储的旧值,之前的保存结果直接被重置 - UISwitch触发值变化时,仅修改了内存中的
userDefaultSamarxvo变量,没有把最新值写入UserDefaults - 开关值绑定逻辑存在错误:当前代码不管开关是开还是关都执行
toggle(),会导致变量值和开关状态不同步
修复方案
修改后的完整可运行代码如下:
var userDefaultSamarxvo: Bool = true let defaults = UserDefaults.standard override func viewDidLoad() { super.viewDidLoad() // 先从UserDefaults取值,不存在存储值时先设置初始默认值 if let savedValue = defaults.object(forKey: "Samarxvo") as? Bool { userDefaultSamarxvo = savedValue } else { userDefaultSamarxvo = true defaults.set(userDefaultSamarxvo, forKey: "Samarxvo") } // 同步UISwitch初始状态,请替换下方注释里的变量名为你实际的开关IBOutlet名 // samarxvoSwitch.isOn = userDefaultSamarxvo if userDefaultSamarxvo { print("hello") } else { print("olleh") } } @IBAction func samarxvoDidChange(_ sender: UISwitch) { // 直接同步开关状态到变量,无需toggle避免逻辑混乱 userDefaultSamarxvo = sender.isOn // 把最新值写入UserDefaults defaults.set(userDefaultSamarxvo, forKey: "Samarxvo") // 手动触发同步,避免系统自动写入延迟导致重启后读取不到 defaults.synchronize() if sender.isOn { print("samarxo") } else { print("samarxo 1 ") } }
内容的提问来源于stack exchange,提问作者Nergezeev Alik
相关产品推荐
相关产品推荐

