swift4中如何正确使用选择器

How to properly use selectors in swift 4

我看了很多教程甚至是苹果官方文档,一定不明白这段代码有什么问题。

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 对象,应用程序就会崩溃并出现此错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[YourApp.PromiseViewController dueDateChanged:]: unrecognized selector sent to instance 0x100b12ae0'

我不明白的是 "selector" 或指向所需函数的指针最初被识别。但是,当我从另一个 UI 对象触发另一个事件时,会抛出此异常。

为什么会这样?

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

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

一个控件可以添加多个目标动作。在某个地方,也许在你的故事板或 xib 中,你有另一个动作添加到 dueDatePicker.

只需在你的函数前面加上@objc

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