7

UITextField複数のオブジェクトを持つビューに取り組んでいます。ビュー コントローラーは として機能し、表示されているレコードを保存して検証するメソッドをUITextFieldDelegate実装しました。(BOOL)textFieldShouldEndEditing:(UITextField *)textField

ユーザーがアイテムの編集後に [完了] ボタンをクリックし、保存/検証が失敗した場合、UIAlertViewが表示され、ユーザーはUITextField検証に失敗した にとどまります。

私の問題はこれです-ユーザーが別のsUITextFieldへの保存/検証に失敗するからクリックすると、メソッドが複数回呼び出され、複数回ポップアップします。UITextField(BOOL)textFieldShouldEndEditing:(UITextField *)textFieldUIAlertView

(BOOL)textFieldShouldEndEditing:(UITextField *)textFieldユーザーがキーボードの [完了] をクリックすると が 1 回呼び出されるのに、別の をクリックすると複数回呼び出されるのはなぜUITextFieldですか?

これが私のコードです:

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    NSLog(@"textFieldShouldEndEditing called by textField with text=%@", textField.text);

    currentItem.nameOrNumber = nameOrNumber.text;

    // Try to save the managed object.
    NSError *error = nil;
    if (![[currentItem managedObjectContext] save:&error]) {        
        UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Uh Oh!",@"")
                                                             message:[error localizedDescription]
                                                            delegate:self
                                                   cancelButtonTitle:NSLocalizedString(@"OK",@"")
                                                   otherButtonTitles:nil];
        [errorAlert show];
        [errorAlert release];
        shouldEnd = NO;
    }

    return shouldEnd;
}
4

4 に答える 4

4

問題は、textField を編集しているときに textField メソッドが呼び出され、別のメソッドを直接タップする順序にある​​と思います。

私が間違っていなければ、次のようになっているはずです(Aで編集してBをタップします)

  • textFieldShouldBeginEditingフィールド B の場合
  • textFieldShouldEndEditingフィールド A の場合
  • textFieldDidEndEditingフィールド A の場合
  • textFieldDidBeginEditingフィールド B の場合

したがって、textFieldShouldEndEditingメソッドにいるとき、テキストフィールド B はすでにファーストレスポンダーになっています。したがって、UIAlertView を表示させると、B はフォーカスを失い、呼び出しtextFieldShouldEndEditingも行われます!

これは、textField の編集が開始されたときにビューを上げたいときにも問題でした。私が見つけた解決策は、現在ある textField から別の textField に切り替えているかどうかを示すブール型クラス変数を作成することでした。TRUEintextFieldShouldBeginEditingFALSEinに設定しましたtextFieldDidBeginEditing。にいるときにtextFieldShouldEndEditing、に設定されてTRUEいる場合は、ユーザーが別の textField を直接タップしたことを意味します。次に、テストを 1 回だけ行う正しい方法を見つける必要があります (おそらく shouldEndEditing は false または何かを返す必要があります)。

于 2010-06-27T23:38:32.147 に答える
1

別のオプションは、UIAlertView偽物に正しい検証をさせ、修正部分を後で延期することです。このようなもの :

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    double delayInSeconds = 0.;
    self.currentTextField.text = @"Something that won't trigger validation error";
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        // do what you need here
    });
}
于 2015-07-29T14:55:40.323 に答える
0

各テスト フィールドで 2 回呼び出されるようです。なんで?考えてみてください... 私にも伝わって頭が痛くなりました

このようなことはできません

- (BOOL)textFieldShouldEndEditing:(UITextField *)txtField{

if(i_dont_know){
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title" 
                                                    message:@"Message"
                                                   delegate:self 
                                          cancelButtonTitle:@"Ok" otherButtonTitles: nil];
    [alert show];
    [alert release];
    return false;
}

return true;}

UIAlertView ショーもテキスト フィールドの編集を辞任しようとしており、この関数を "textFieldShouldEndEditing:" と呼んでいるということですか...

したがって、これを解決する私の方法は、インターフェイスのデラレーションに「shouldEndEditing」と呼ばれるメンバー変数を追加することでした。これはデフォルトで真です。そして、「textFieldShouldEndEditing:」の後は、次のようになります。

- (BOOL)textFieldShouldEndEditing:(UITextField *)txtField{

if(shouldEndEditing == false)
{
    shouldEndEditing = true;
    return false;
}

if(i_dont_know){
    shouldEndEditing = false;
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title" 
                                                    message:@"Message"
                                                   delegate:self 
                                          cancelButtonTitle:@"Ok" otherButtonTitles: nil];
    [alert show];
    [alert release];
    return false;
}

return true;}

幸運を...

于 2010-07-14T09:34:53.953 に答える