Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to properly use selectors in swift 4

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?

like image 813
Kohler Fryer Avatar asked Jun 22 '17 01:06

Kohler Fryer


2 Answers

The error is telling you that an action with the selector dueDateChanged(_:) has been added as a target action.

More than one target action can be added to a control. Somewhere, maybe in your storyboard or xib, you have another action added to dueDatePicker.

like image 111
Jeffery Thomas Avatar answered Nov 16 '22 12:11

Jeffery Thomas


Just add @objc in front of your function

@objc func datePickerValueChanged(_ sender: UIDatePicker){
    //Do Stuff
}
like image 33
Leang Socheat Avatar answered Nov 16 '22 12:11

Leang Socheat