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

如何从另一个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 06:12:00