10

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

デリゲート メソッドを使用すると、NO を返すことができるため、ユーザーが編集を停止できるという事実を除けば、これら 2 つの点に違いはありますか?

編集の開始または編集の終了を処理するための同じ質問。これは、適切なデリゲート メソッドまたは適切なイベントを使用して行うことができます。コントロールイベントが必要な作業を実行できる場合、実際には textField デリゲートは何のためにあるのでしょうか?

4

5 に答える 5

9

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

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

shouldChangeCharactersInRange入力の検証チェックを実装するためによく使用されます。つまり、入力時に文字/貼り付けられたテキストをフィルターできます。たとえば、フィールドが電話番号用のFALSE場合、ユーザーが数字以外の文字を入力したり、数字以外のテキストを貼り付けようとしたりすると、返される可能性があります。

複数のコントロールにコードを再利用できるケースが見つかるかもしれません。UIControlEvent-methods.

于 2011-02-25T04:21:22.840 に答える
7

あなたが正しい; 基本的に両方を介して同じことを行うことができますが、UIControl は下位レベルであり、[UIControl addTarget:action:forControlEvents:]デリゲートが 1 つしかないため、特定の各 UIEvent を where を介して異なるターゲットに吸い上げることができます。

また、 UITextField デリゲート プロトコルは、UITextField の動作を管理する方法として、UIControl/UIEvent のより便利で高レベルの代替手段として単に存在するとも言えます。

最も一般的なデリゲート パターンは UITableView DataSource と Delegate であり、UITextField デリゲート プロトコルの使用は非常に似ているため、UIControl からメッセージを直接処理するよりも、より明確な意図を持ったはるかに簡単に見えます。

于 2011-02-22T04:36:06.840 に答える
6

元の質問で提示された2つのアプローチの間に私が見つけた重要な違いの1つは、変更の値の"shouldChangeCharactersInRange"にデリゲートが呼び出されることです。のターゲットは、変更の値の後に呼び出されます。 UITextFieldUIControlEventEditingChangedUITextField

これらのイベントを使用して、(たとえば)[完了]ボタンを有効にする前にダイアログのすべてのフィールドが完全に入力されていることを確認する場合は、ターゲットアプローチの方が適している可能性があります。それは私のためになりました。

于 2012-06-03T22:29:37.400 に答える
1

委任アプローチは、均質化UITextFieldUITextView動作を行う方法です。

UITextView制御イベントはありません。対照的に、並列メソッドUITextFieldDelegateを提供します。UITextviewDelegate

于 2011-11-01T11:08:18.987 に答える
0

テキストの挿入と削除にshouldChangeCharactersInRange同じパスを渡すことがわかりました。NSRangeスペースを追加してから削除すると、 のパラメーターshouldChangeCharactersInRangeはテキストの重複と区別できなくなります。

したがってshouldChangeCharactersInRange、結果のテキストを実際に予測することはできません。

于 2011-11-15T21:30:02.290 に答える