iOS应用开发中如何将UISwitch状态值存储到通知中心
注:iOS系统的通知中心(NotificationCenter)本身为消息中转组件,不提供持久化存储能力,通常我们会结合「持久化存储组件+通知中心」实现状态存管+跨模块同步的需求,以下是具体实现方案:
实现方案
方案1:状态持久化存储+通知中心广播变更(最常用)
适用于需要开关状态在APP重启后依然保留,同时其他业务模块需要实时感知开关变化的场景。
- 步骤1:为UISwitch添加值变化监听事件
Swift 代码示例:
Objective-C 代码示例:yourSwitch.addTarget(self, action: #selector(switchValueChanged(_:)), for: .valueChanged)[yourSwitch addTarget:self action:@selector(switchValueChanged:) forControlEvents:UIControlEventValueChanged]; - 步骤2:实现状态变更回调,同时完成持久化存储+通知发送操作
Swift 代码示例:
Objective-C 代码示例:@objc func switchValueChanged(_ sender: UISwitch) { // 持久化存储开关状态到UserDefaults UserDefaults.standard.set(sender.isOn, forKey: "kUserSwitchOpenStatus") // iOS12+系统会自动同步存储,特殊场景需要立即落盘可以加下行代码 // UserDefaults.standard.synchronize() // 发送状态变更通知到通知中心,携带当前开关状态 NotificationCenter.default.post( name: NSNotification.Name("kUserSwitchStatusDidChange"), object: nil, userInfo: ["isOpen": sender.isOn] ) }- (void)switchValueChanged:(UISwitch *)sender { // 持久化存储开关状态到NSUserDefaults [[NSUserDefaults standardUserDefaults] setBool:sender.isOn forKey:@"kUserSwitchOpenStatus"]; [[NSUserDefaults standardUserDefaults] synchronize]; // 发送状态变更通知到通知中心 [[NSNotificationCenter defaultCenter] postNotificationName:@"kUserSwitchStatusDidChange" object:nil userInfo:@{@"isOpen": @(sender.isOn)}]; } - 步骤3:需要感知开关变化的模块添加通知监听
Swift 代码示例:// 在模块初始化阶段添加监听 NotificationCenter.default.addObserver( self, selector: #selector(handleSwitchStatusChange(_:)), name: NSNotification.Name("kUserSwitchStatusDidChange"), object: nil ) // 实现通知处理逻辑 @objc func handleSwitchStatusChange(_ notification: Notification) { guard let isOpen = notification.userInfo?["isOpen"] as? Bool else { return } // 此处编写状态变更后的业务代码 } // 模块销毁时移除监听,避免内存泄漏或崩溃 deinit { NotificationCenter.default.removeObserver(self) } - 步骤4:APP启动/页面加载时读取已存储的状态,给UISwitch赋初始值
let savedStatus = UserDefaults.standard.bool(forKey: "kUserSwitchOpenStatus") yourSwitch.isOn = savedStatus
方案2:仅通过通知中心同步状态(无需持久化)
如果不需要长期保存开关状态,仅需跨组件/跨页面实时同步状态,可以省略UserDefaults存储的逻辑,仅保留方案1中的通知发送、监听逻辑即可。
注意事项
- 通知名称、存储用的key建议定义为全局常量,避免手写字符串出错
- 通知监听者必须在销毁前移除监听,iOS9+之后系统会自动部分处理,但手动移除更稳妥
- iOS13+项目可以用Combine框架的Publisher替代通知中心实现状态监听,代码简洁度更高
内容的提问来源于stack exchange,提问作者Nergezeev Alik
相关产品推荐
相关产品推荐

