-1

私のアプリには、ユーザーが個人情報を入力するビュー コントローラーがあります。保存しないとデータが失われることを通知するアラートを表示するキャンセル オプションがあります。このView Controllerのテキストフィールドに [.text.length > 0] がある場合にのみ、このアラートを表示したい(約20個のテキストフィールドがあり、1文字でもアラートを表示する必要があります)。if ステートメント内のすべてのテキスト フィールドに手動で名前を付けることができましたが、ビュー コントローラー内のすべてのテキスト フィールドをチェックする何らかの方法があることを望んでいましたか?

これが私がこれまでに持っているものです:

for (UIView *view in [self.view subviews]) {
    if ([view isKindOfClass:[UITextField class]]) {
        UITextField *textField = (UITextField *)view;
        if(textField.text.length >= 1){
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Cancel?"
                                                                message:@"If you leave before saving, the athlete will be lost. Are you sure you want to cancel?"
                                                               delegate:self
                                                      cancelButtonTitle:@"No"
                                                      otherButtonTitles:@"Yes", nil];

            [alertView show];
        }
        if(textField.text.length == 0){
            [[self navigationController] popViewControllerAnimated:YES];
        }
    }
}

値を持つテキスト フィールドがあるかどうかを確認したいのですが、for ループが終了する前に textField.text.length == 0 かどうかを確認するため、エラーが発生します。

解決:

BOOL areAnyTextFieldsFilled = NO;
for (UIView *view in [self.view subviews]) {
    if ([view isKindOfClass:[UITextField class]]) {
        UITextField *textField = (UITextField *)view;
        if(textField.text.length >= 1){
            areAnyTextFieldsFilled = YES;

        }

    }
}
if(areAnyTextFieldsFilled == YES){
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Cancel?"
                                                        message:@"If you leave before saving, the athlete will be lost. Are you sure you want to cancel?"
                                                       delegate:self
                                              cancelButtonTitle:@"No"
                                              otherButtonTitles:@"Yes", nil];

    [alertView show];
}
else{
    [[self navigationController] popViewControllerAnimated:YES];
}
4

1 に答える 1

3

タグを使用すると、非常に優れたものを実現できます。それぞれを特定のタグ 1、2、...、20 に設定します。次に、次のように繰り返します。

    for (int x = 1; x < 21; x++)
    {
        UITextField *aTextField = (UITextField *) [self.view viewWithTag:x];
        //check here if text
    }

また、効率を高めるために、ゼロから始まるフラグを設定できます。ユーザーが textField を編集すると、フラグは 1 に変更されます。次に、それが1つの場合にのみループします。


ただし、現在のメソッドでできることは、フラグを設定することです (はい、繰り返しますが、私はそれらが大好きです :)) 事前にフラグをゼロに設定します (おそらく viewDidLoad で)。単語を含むテキスト フィールドに出くわした場合は、1 に設定します。現在のif(textField.text.length == 0)ステートメントを消去します。その後、ループ後にフラグがまだ == 0 かどうかを確認します。

于 2013-09-06T22:41:29.877 に答える