Как правильно использовать селекторы в swift 4

Я прочитал много учебников и даже официальную документацию Apple и не должен понимать, что не так с этим кодом.

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
}

во время выполнения я нажимаю на текстовое поле, и появляется UIDatePicker. Функция селектор очков выполняется. Как только я нажимаю объект UI за пределами UIDatePicker, приложение аварийно завершает работу с этой ошибкой:

прекращение приложения из-за необработанных исключений 'NSInvalidArgumentException', причина: '-[YourApp.PromiseViewController dueDateChanged:]: нераспознанный селектор отправлен в экземпляр 0x100b12ae0'

чего я не понимаю, так это того, что "селектор" или указатель на нужную функцию распознается изначально. Однако, когда я запускаю другое событие из другого объекта UI, это исключение создается.

почему это происходит?

не должно ли это исключение срабатывать, когда datePickerValueChanged() изначально называется?

2 ответов


ошибка говорит вам, что действие с селектором dueDateChanged(_:) было добавлено в качестве целевого действия.

в элемент управления можно добавить несколько целевых действий. Где-то, возможно, в вашей раскадровке или xib, у вас есть еще одно действие, добавленное в dueDatePicker.


просто добавьте @objc перед вашей функцией

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