1

問題:イベントを処理するメソッドとeditingChanged、オブジェクト モデルからテキスト フィールドを更新する別のメソッドがあります。問題は、イベントを送信したフィールドのテキストを変更すると、editingChanged が再びトリガーされ、無限ループに入る (ios 5 のみ) ことです。

例:

- (IBAction)updateFields:(UITextField *)sender {
    if ([self myCustomValidation:sender]) {
        ... //update model
        //call another method that essentially does this
        field1.text = @"someformatted text"; //causes infinite loop if any field == sender
        field2.text = @"some more text";
    }
}

この問題をどのように回避しますか (メッセージsenderを送信するすべてのメソッドに渡す必要はありません)。setText:

4

2 に答える 2

2

コントロール イベントに登録する代わりに、UITextFieldDelegateのメソッドを実装することを検討してください。textField:shouldChangeCharactersInRange:replacementString:editingChanged

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    ... //update model
    //call another method that essentially does this
    field1.text = @"someformatted text";  //causes infinite loop any field == sender
    field2.text = @"some more text";
    return YES; // or NO, depending on you actions
}

ドキュメントによると、それはあなたの目的に役立つはずです

ユーザーがテキスト フィールドに新しい文字を入力するか、既存の文字を削除するたびに、テキスト フィールドはこのメソッドを呼び出します。

于 2013-03-27T20:33:25.190 に答える
1

独自のIBAction メソッドを記述する代わりに、UITexFeild デリゲートを実装するだけです。

text の変更を検出するには、shouldChangeCharactersInRangeデリゲートを実装します。

編集の終了を検出するには、textFieldDidEndEditingデリゲートを実装します。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range      replacementString:(NSString *)string
{
  //write ur code here
  return YES;
}

- (void)textFieldDidEndEditing:(UITextField *)textField{

}
于 2013-03-27T20:36:14.557 に答える