两个UISegmentedControl联动异常:返回后值未更新与存储
解决两个UISegmentedControl联动更新问题
我看了你的代码,发现从设置页面返回主页面后值没更新也没存储的核心问题有两个:一是主页面不会自动重新读取UserDefaults的新值,二是返回时的segue方式可能导致创建了新的主页面实例,而不是回到原来的页面。下面是具体的修复步骤:
1. 让主页面在显示时自动刷新数据
主页面的viewDidLoad只会在首次加载时执行,从设置页面返回时不会触发。我们需要在viewWillAppear方法里重新读取保存的配置并更新UI:
在ViewController类中添加以下方法:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 读取保存的默认小费索引 let savedTipIndex = defaults.integer(forKey: "default_tip_index") tipController.selectedSegmentIndex = savedTipIndex // 自动重新计算小费,更新所有标签 calculateTip(self) }
2. 优化设置页面的返回逻辑
你当前用performSegue返回主页面,这会创建一个新的ViewController实例,而不是回到原来的页面。应该用dismiss方法直接关闭模态页面:
修改SettingViewController中的两个按钮方法:
@IBAction func saveButton(_ sender: Any) { let selectedIndex = settingsTipController.selectedSegmentIndex // 保存到UserDefaults defaults.set(selectedIndex, forKey: "default_tip_index") // 关闭设置页面,回到主页面 self.dismiss(animated: true, completion: nil) } @IBAction func Back(_ sender: Any) { // 直接关闭页面,不需要保存 self.dismiss(animated: true, completion: nil) }
3. 移除多余的synchronize()调用
iOS 7及以后,UserDefaults会自动同步到磁盘,不需要手动调用synchronize(),可以把代码里所有的defaults.synchronize()都删掉,减少不必要的操作。
为什么这样能解决问题?
viewWillAppear会在页面每次即将显示时执行,所以从设置页面返回时,主页面会重新读取最新的小费索引并更新分段控件,同时调用calculateTip刷新所有金额标签。- 用
dismiss返回会回到原来的主页面实例,而不是创建新的,这样新的设置值就能直接反映在原来的页面上。
修改后再测试,你就能看到从设置页面返回后,主页面的分段控件会自动更新到保存的索引,金额也会重新计算啦!
内容的提问来源于stack exchange,提问作者anon anon
相关产品推荐
相关产品推荐

