How to properly use selectors in swift 4

Kohler Fryer picture Kohler Fryer · Jun 22, 2017 · Viewed 9k times · Source

I have read many tutorials and even the official Apple documentation and must not understand what is wrong with this code.

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
}

At runtime, I click on the textField and the UIDatePicker appears. The function that the selector points to is executed. As soon as I click a UI object outside of the UIDatePicker, the app crashes with this error:

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

What I don't understand is that the "selector" or pointer to the desired function is recognized initially. However, when I trigger another event from another UI Object this exception is thrown.

Why is this happening?

Shouldn't this exception be triggered when datePickerValueChanged() is called initially?

Answer

Leang Socheat picture Leang Socheat · Jun 22, 2017

Just add @objc in front of your function

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