私は多くのチュートリアルと公式の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
}
_
実行時に、textFieldをクリックすると、UIDatePickerが表示されます。セレクターが指す関数が実行されます。 UIDatePickerの外のUIオブジェクトをクリックするとすぐに、アプリは次のエラーでクラッシュします。
キャッチされない例外「NSInvalidArgumentException」が原因でアプリを終了しています。理由:「-[YourApp.PromiseViewController dueDateChanged:]:認識されないセレクターがインスタンス0x100b12ae0に送信されました」
私が理解していないのは、「セレクタ」または目的の関数へのポインタが最初に認識されることです。ただし、別のUIオブジェクトから別のイベントをトリガーすると、この例外がスローされます。
なぜこうなった?
この例外は、datePickerValueChanged()
が最初に呼び出されたときにトリガーされるべきではありませんか?
エラーは、セレクターdueDateChanged(_:)
のアクションがターゲットアクションとして追加されたことを示しています。
1つのコントロールに複数のターゲットアクションを追加できます。ストーリーボードまたはxibのどこかに、dueDatePicker
に別のアクションが追加されています。
関数の前に@objcを追加するだけです
@objc func datePickerValueChanged(_ sender: UIDatePicker){
//Do Stuff
}