【发布时间】:2017-01-12 22:05:50
【问题描述】:
我目前正在学习 swift 并开始使用我自己的第一个计算器。 这一切都通过一个按钮来计算结果,但我想稍微改进一下。 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
}
}
}
【问题讨论】:
-
你在哪里打电话给
operatorChanged?问题是你的方法没有参数,但错误说它调用了一个同名但有参数的方法(后面有“:”)。你把它和故事板联系起来了吗?如果是,要么重命名operatorChanged以接受每个 IBAction 所做的事情,作为发件人,要么在 Storyboard 中重新链接它。 -
@Larme 是的,我通过我的主故事板链接了它。我已经尝试重新链接它。你知道如何解决它吗?非常感谢你:)