如何从另一个ViewController获取UISegmentedControl的选中索引?
问题根源
你的代码核心错误是在setLevel方法中通过SettingsScreen()创建了全新的设置页实例,该实例和你之前操作过的设置页完全无关,自然无法获取到用户选中的难度索引。同时你的代码还存在拼写错误:主VC中displaytext应为IBOutlet定义的displayText。
解决方案(闭包回调实现,最简便)
第一步:修改设置页 SettingsScreen 代码
public class SettingsScreen: UIViewController { @IBOutlet weak var levelPick: UISegmentedControl! @IBOutlet weak var operationPick: UISegmentedControl! // 定义回调闭包,参数为选中的难度索引 var onLevelSelected: ((Int) -> Void)? public override func viewDidLoad() { super.viewDidLoad() // 监听分段控件值变化事件 levelPick.addTarget(self, action: #selector(levelDidChange), for: .valueChanged) } @objc private func levelDidChange() { // 难度变化时触发回调,把选中索引传出去 onLevelSelected?(levelPick.selectedSegmentIndex) } // 如果需要点击返回时才传值,可以把回调放在viewWillDisappear里 public override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) onLevelSelected?(levelPick.selectedSegmentIndex) } }
第二步:修改主VC MainScreen 代码
class MainScreen: UIViewController { @IBOutlet weak var displayText: UILabel! // 新增属性存储当前选中的难度索引,默认设为0(简单) private var currentLevel: Int = 0 public override func viewDidLoad() { super.viewDidLoad() } // 如果是用代码push跳转设置页,用这个方法: func goToSettings() { // 拿到跳转用的SettingsScreen真实实例,如果你用Storyboard初始化请对应修改 let settingsVC = SettingsScreen() // 给闭包赋值,接收传回来的难度索引 settingsVC.onLevelSelected = { [weak self] level in self?.currentLevel = level } navigationController?.pushViewController(settingsVC, animated: true) } // 如果是用Storyboard Segue跳转,就用这个方法拿实例: override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let settingsVC = segue.destination as? SettingsScreen { settingsVC.onLevelSelected = { [weak self] level in self?.currentLevel = level } } } func setLevel() { switch currentLevel { // 简单 case 0: displayText.text = "test1" // 中等 case 1: displayText.text = "test2" // 困难 case 2: displayText.text = "test3" default: break } } @IBAction func Roll(_ sender: UIButton) { setLevel() } }
其他可选实现方案
- 代理模式:和闭包逻辑类似,定义协议实现传值,适合逻辑更复杂的传值场景
- NotificationCenter:通过全局通知传值,适合多页面同时监听设置变化的场景
- UserDefaults:持久化存储难度值,适合需要下次启动APP保留设置的场景
内容的提问来源于stack exchange,提问作者RAS98
相关产品推荐
相关产品推荐

