2017-06-22 6 views
7

多くのチュートリアルやAppleの公式ドキュメントを読んだことがあります。このコードの何が間違っているのか理解してはいけません。セレクタを適切に使用する方法4

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オブジェクトをクリックすると、アプリがこのエラーでクラッシュ:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[YourApp.PromiseViewController dueDateChanged:]: unrecognized selector sent to instance 0x100b12ae0'

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

どうしてですか?

datePickerValueChanged()が最初に呼び出されたときにこの例外は発生しませんか?

答えて

5

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

複数のターゲットアクションをコントロールに追加できます。どこかで、あなたのストーリーボードやxibに、おそらくdueDatePickerに追加されたアクションがあります。

+0

を@objcを追加します。本当にありがとう。私は自分の存在の真実を疑い始めました。乾杯! –

6

ちょうど私が私がそれを見ていないと信じて傾けるあなたの関数の前に

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

それは吸う溶液です! – Fattie

+0

あなたのアイデアはいかがですか@Fattie –

+2

申し訳ありません!私の言うことは、あなたのソリューションは完璧です! :)しかし、Swiftが今のところこのように動作することは非常に残念ですが、これを行う必要があるのは残念です。 – Fattie