【问题标题】:Validating UITextField and Display an UIAlertView if error验证 UITextField 并在错误时显示 UIAlertView
【发布时间】:2014-07-23 18:55:06
【问题描述】:

如果有错误,我想验证 UITextField 并显示 UIAlertView。

之前我使用了下面的代码。它与 2 个 UITextfields 完美配合,但对于许多 UITextfield,这是不可能的。

任何提示如何显示 UIAlertView 来验证我的 UITexfields 吗?

- (void)processFieldEntries {

    NSString *usernameString = usernameField.text;
    NSString *passwordString = passwordField.text;
    NSString *firstNameString = firstNameField.text;
    NSString *nameString = nameField.text;
    NSString *cityString = cityField.text;

    NSString *errorText = @"Enter";
    NSString *usernameBlankText = @" a username";
    NSString *passwordBlankText = @" a password";
    NSString *prenomBlankText = @" a firstname";
    NSString *nomBlankText = @" a name";
    NSString *joinText = @", ";

    BOOL textError = NO;

    if (identifiantString.length == 0 || motDePasseString.length == 0 || prenomString.length == 0 || nomString.length == 0 || idPoubelle.length == 0) {
        textError = YES;

        if (usernameString.length == 0) {
            errorText = [errorText stringByAppendingString:usernameBlankText];
        }

        if (usernameString.length == 0 || passwordString.length == 0) {
            if (usernameString.length == 0) { 
                errorText = [errorText stringByAppendingString:joinText];
            }
            errorText = [errorText stringByAppendingString:passwordBlankText];
        }
    } 

    if (textError) {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:errorText message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:@"Ok", nil];
        [alertView show];
        return;
    }
}

【问题讨论】:

  • 为什么不能验证超过 2 个文本字段?
  • 当然可以,但是如果我要写所有的情况,代码会很长

标签: ios objective-c uitextfield uialertview uialertviewdelegate


【解决方案1】:

我会这样做:

- (void)processFieldEntries {
    NSString *usernameString = usernameField.text;
    NSString *passwordString = passwordField.text;
    NSString *firstNameString = firstNameField.text;
    NSString *nameString = nameField.text;
    NSString *cityString = cityField.text;

    NSMutableArray *errors = [NSMutableArray array];

    if (usernameString.length == 0) {
        [errors addObject:@"a username"];
    }

    if (passwordString.length == 0) {
        [errors addObject:@"a password"];
    }

    if (firstNameString.length == 0) {
        [errors addObject:@"a first name"];
    }

    if (nameString.length == 0) {
        [errors addObject:@"a name"];
    }

    if (errors.count) {
        NSString *message = [NSString stringWithFormat:@"Enter %@", [errors componentsJoinedByString:@", "]];

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Errors" message:message delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView show];
    }
}

当然,这并不能很好地扩展。考虑创建一组文本字段和错误消息。然后,您可以迭代数组,而不是编写一长串 if 语句。

【讨论】:

    【解决方案2】:

    您还可以在用户输入信息时进行一些额外的检查,例如,名称不应包含数字或字母以外的其他符号。

    一个不错的方法是从 View Controller 类实现 UITextFieldDelegate 协议。

    然后为每个 UITextField 对象设置 tag 属性。

    协议有这个有用的方法:

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
    

    每次您在任何文本框中计时时都会调用它。

    然后你可以检查:

    switch (textfield.tag)
    {
     case TEXT_FIELD_FOR_FIRST_NAME_TAG:
     {
      if (!validateFirstNameFunction) { /* Display some error */ }
    
      break;
     }
    
     case TEXT_FIELD_FOR_LAST_NAME_TAG:
     {
      if (!validateLastNameFunction) { /* Display some error */ }
    
      break;
     }
    
     // And so on...
    
    }
    

    尝试分离功能,这将使代码更清晰,更具可读性。

    希望它也能给你带来一些价值:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      相关资源
      最近更新 更多