10

我已经阅读了许多教程甚至 Apple 官方文档,并且一定不明白这段代码有什么问题。

var dueDatePicker = UIDatePicker()

@IBOutlet weak var textField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
    textField.inputView = dueDatePicker
    dueDatePicker.addTarget(self, action: #selector(datePickerValueChanged(_:)), for: UIControlEvents.valueChanged)
}

func datePickerValueChanged(_ sender: UIDatePicker){
    //Do Stuff
}

在运行时,我单击 textField 并出现 UIDatePicker。选择器指向的函数被执行。一旦我单击 UIDatePicker 之外的 UI 对象,应用程序就会崩溃并出现以下错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[YourApp.PromiseViewController dueDateChanged:]:无法识别的选择器发送到实例 0x100b12ae0”

我不明白的是,最初识别出“选择器”或指向所需函数的指针。但是,当我从另一个 UI 对象触发另一个事件时,会引发此异常。

为什么会这样?

datePickerValueChanged()最初调用时不应该触发此异常吗?

4

2 回答 2

8

只需在您的函数前面添加@objc

@objc func datePickerValueChanged(_ sender: UIDatePicker){
    //Do Stuff
}
于 2017-06-22T02:57:55.667 回答
5

该错误告诉您带有选择器的操作dueDateChanged(_:)已添加为目标操作。

一个控件可以添加多个目标操作。在某个地方,可能在您的故事板或 xib 中,您添加了另一个动作到dueDatePicker.

于 2017-06-22T02:15:01.387 回答