Kohler Fryer
Kohler Fryer

Reputation: 764

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?

Upvotes: 10

Views: 9073

Answers (2)

Leang Socheat
Leang Socheat

Reputation: 1174

Just add @objc in front of your function

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

Upvotes: 8

Jeffery Thomas
Jeffery Thomas

Reputation: 42588

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.

Upvotes: 5

Related Questions