web-dev-qa-db-ja.com

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
}
_

実行時に、textFieldをクリックすると、UIDatePickerが表示されます。セレクターが指す関数が実行されます。 UIDatePickerの外のUIオブジェクトをクリックするとすぐに、アプリは次のエラーでクラッシュします。

キャッチされない例外「NSInvalidArgumentException」が原因でアプリを終了しています。理由:「-[YourApp.PromiseViewController dueDateChanged:]:認識されないセレクターがインスタンス0x100b12ae0に送信されました」

私が理解していないのは、「セレクタ」または目的の関数へのポインタが最初に認識されることです。ただし、別のUIオブジェクトから別のイベントをトリガーすると、この例外がスローされます。

なぜこうなった?

この例外は、datePickerValueChanged()が最初に呼び出されたときにトリガーされるべきではありませんか?

10
Kohler Fryer

エラーは、セレクターdueDateChanged(_:)のアクションがターゲットアクションとして追加されたことを示しています。

1つのコントロールに複数のターゲットアクションを追加できます。ストーリーボードまたはxibのどこかに、dueDatePickerに別のアクションが追加されています。

5
Jeffery Thomas

関数の前に@objcを追加するだけです

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