尝试访问分段控制索引时Swift抛出错误

时间:2016-09-05 13:58:11

标签: ios swift xcode

我目前正在快速学习并开始使用我自己的第一个计算器。 这一切都用一个按钮来计算结果,但我想稍微改进一下。 UI基本上由两个用于数字的文本字段,一个用于操作符的分段控件和一个用于显示结果的标签组成。这就是我想要发生的事情:

每次更改分段控制值时,都应计算并显示新结果。

错误:

[Calculator.MainInterfaceViewController operatorChanged:]:无法识别的选择器发送到实例XXXX ... *由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:' - [Calculator.MainInterfaceViewController operatorChanged:]:无法识别的选择器发送到实例XXXX * 第一次抛出调用堆栈: ... libc ++ abi.dylib:以NSException类型的未捕获异常终止 (LLDB)

我的班级:

class MainInterfaceViewController: UIViewController, UITextFieldDelegate {

@IBOutlet var ersteZahl: UITextField!
@IBOutlet var zweiteZahl: UITextField!

@IBOutlet weak var ergebnisLabel: UILabel!
@IBOutlet weak var segment: UISegmentedControl!

override func viewDidLoad() {
    super.viewDidLoad()
    ersteZahl.delegate = self;
    zweiteZahl.delegate = self;
}

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    let newString = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string) as NSString
    textField.text = newString as String
    refreshUIElements()
    return false
}

@IBAction func operatorChanged() {
    refreshUIElements()
}


func refreshUIElements() {
    let zahl1 = NSString(string: ersteZahl.text!).doubleValue
    let zahl2 = NSString(string: zweiteZahl.text!).doubleValue

    switch self.segment.selectedSegmentIndex {
    case 0:
        ergebnisLabel.text = "Ergebnis: \(zahl1 + zahl2)"
    case 1:
        ergebnisLabel.text = "Ergebnis: \(zahl1 - zahl2)"
    case 2:
        ergebnisLabel.text = "Ergebnis: \(zahl1 * zahl2)"
    case 3:
        if zahl2 == 0 {
            ergebnisLabel.text = "Error: Cannot divide by 0."
            return
        }
        ergebnisLabel.text = "Ergebnis: \(zahl1 / zahl2)"
    default:
        break
    }
}


}

1 个答案:

答案 0 :(得分:2)

我猜你在自动生成或尝试手动创建方法后修改了方法?

@IBAction's需要sender参数。像这样:

operatorChanged(sender: UISegmentedControl) {
}

完全删除方法,然后从故事板再次按住Ctrl键拖动到文件中。如果是弹出窗口,请选择操作并为方法命名。在此之后不要修改方法定义,否则会导致同样的问题。