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
相关产品推荐
相关产品推荐

