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

UISegmentedControl报错无selectedSegmentIndex成员该如何处理?

错误根因

报错是因为你调用selectedSegmentIndex的对象错误:
你的IBAction方法名本身就是segmentedControl,执行segmentedControl.selectedSegmentIndex时,系统会将segmentedControl识别为当前方法对象,而非你关联的UISegmentedControl控件实例,因此无法找到对应属性。
此外你已经通过方法入参sender获取到了触发事件的分段控件实例,不需要重复获取选中下标。

你的代码还存在几处隐藏问题:

  • number1和number2都取了label1.text的值,两个操作数完全一致,运算结果不符合预期
  • 直接强制解包可选值,输入非数字时会直接崩溃
  • 除法运算没有做除数为0的判断,运行时会触发错误

修正后可运行代码

@IBAction func segmentedControl(_ sender: UISegmentedControl) {
    // 替换label2为你实际存放第二个操作数的控件名
    guard let text1 = label1.text, let number1 = Int(text1),
          let text2 = label2.text, let number2 = Int(text2) else {
        // 输入非数字时提前返回避免崩溃
        return
    }
    // 直接从sender取选中下标即可
    let selectedSegmentIndex = sender.selectedSegmentIndex
    var result = 0
    if selectedSegmentIndex == 0 {
        result = number1 + number2
    } else if selectedSegmentIndex == 1 {
        result = number1 - number2
    } else if selectedSegmentIndex == 2 {
        result = number1 * number2
    } else if selectedSegmentIndex == 3 {
        // 除数为0时提前返回避免崩溃
        guard number2 != 0 else {
            return
        }
        result = number1 / number2
    }
    // 自行添加结果赋值逻辑,比如 resultLabel.text = "\(result)"
}

可选优化建议

用switch语句替代多组if else判断,代码可读性更高:

switch selectedSegmentIndex {
case 0: result = number1 + number2
case 1: result = number1 - number2
case 2: result = number1 * number2
case 3: 
    guard number2 != 0 else { return }
    result = number1 / number2
default: break
}

内容的提问来源于stack exchange,提问作者Carter Quackenbush

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:15:03