2011-02-07 21 views
9

ユーザーが入力するなど、UITextFieldへの変更を処理したい場合は、そのテキストフィールドにデリゲートを割り当て、デリゲートがshouldChangeCharactersInRangeを実装するか、textFieldにターゲットを追加してUIControlEventEditingChangedイベントを処理することで、これを行うことができるようです。UITextFieldDelegateとUITextFieldコントロールのイベント

デリゲートメソッドを使用すると、NOを返すことができるため、ユーザーが編集をやめるのを防ぐことができます。これらの2つの違いはありますか?

編集の開始や編集の終了を処理するのと同じ質問です。これは、適切な委任方法または適切なイベントのいずれかで実行できます。コントロールイベントが必要な作業を行うことができる場合、実際にtextFieldデリゲートとは何ですか?

答えて

6

あなたはそうです。 UIControlはより低いレベルであり、[UIControl addTarget:action:forControlEvents:]を介してそれぞれの特定のUIEventを異なるターゲットにサイフォンできるようにします。ここでは、単一のデリゲートだけが存在します。

また、UITextField delegate protocolは、UITextFieldの動作を管理する方法として、UIControl/UIEventのより便利で高水準の代替手段として存在するとも言えます。

最も一般的なデリゲートパターンはUITableView DataSourceとDelegateであり、UITextFieldデリゲートプロトコルを使用するとかなり似ているため、UIControlからのメッセージを直接渡すよりもはるかに単純なものになります。

9

shouldChangeCharactersInRangeが変更される前に呼び出され、変更をキャンセルする機会が与えられます。変更が発生した後にUIControlEventEditingChangedが呼び出されます。

textFieldの結果の値をshouldChangeCharactersInRangeに設定できますが、指定された範囲を使用してreplacementStringを既存のテキストに手動で適用する必要があります。 (NSString stringByReplacingCharactersInRangeを介して)。結果のテキストを知りたい場合は、UIControlEventEditingChangedを使用する方が簡単で効率的です。

shouldChangeCharactersInRangeは、入力の検証チェックを実装するためによく使用されます。つまり、入力された文字/ペーストされたテキストをフィルタリングできます。たとえば、電話番号用のフィールドの場合、ユーザーが数字以外の文字を入力するか数値ではないテキストに貼り付けようとするとFALSEを返すことができます。

あなたが委任アプローチがUITextFieldUITextView行動を均質化するための方法ですUIControlEvent-methods.

1

に固執することができます場合は、複数のコントロールのためのコードを再利用することができますケースを見つけるかもしれません。

UITextViewには制御イベントがありません。対照的に、UITextFieldDelegateおよびUITextviewDelegateは、並列方法を提供する。

0

私は、shouldChangeCharactersInRangeがテキストの挿入と削除に同じNSRangeを渡すことを知りました。空白を追加して削除し、shouldChangeCharactersInRangeのパラメータはテキストの重複と区別できません。

したがってshouldChangeCharactersInRangeは実際に結果テキストを予測することはできません。私は2つのアプローチの間で見つけた

6

一つの重要な違いは、元の質問に提起デリゲート"shouldChangeCharactersInRange"UITextField変更で前の値に呼び出されるということです。 UIControlEventEditingChangedのターゲットはの後にとなり、UITextFieldの値が変更されます。

「完了」ボタンを有効にする前に、これらのイベントを使用してダイアログ内のすべてのフィールドが完全に入力されていることを確認する場合は、ターゲットアプローチが効果的です。それは私のためにやった。

関連する問題