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

两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:44:40