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
}
我看了很多教程甚至是苹果官方文档,一定不明白这段代码有什么问题。
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
}