【问题标题】:What is a convenient way to check UITextFields for errors before allowing a form to submit?在允许表单提交之前检查 UITextFields 是否有错误的便捷方法是什么?
【发布时间】:2014-02-20 21:44:39
【问题描述】:

我整天都在做这个,只是无法理解它。在我的应用程序的一个表单上,我使用-[UITextFieldDelegate textFieldDidEndEditing]: 来注册任何错误并将它们存储在NSMutableArray 实例变量formErrors 中。

我打算在按下提交按钮时使用formErrors,或者在表单出现错误时禁用该按钮。问题是错误计数无处不在。我刚刚让自己感到困惑,因为您可以看到我的代码在哪里增加和减少,以便尝试控制正在发生的事情,但只会让自己更加困惑。

错误消息会像这样放在formErrors 上:

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


if ( textField == [self nameField] ) {

    if ( ([[textField text] isEqualToString:@""]) ) {
        [formErrors addObject:@"What is your name?"];
        errorCount++;
    } else {
        errorCount--;
        if ( ([[textField text] length] < 2) || ([[textField text] length] > 20) ) {
            [formErrors addObject:@"Name must contain a minimum of 2 and a maximum of 20 characters only."];
            errorCount++;
        } else {
            errorCount--;
            if ([[textField text] rangeOfCharacterFromSet:alphaSet].location != NSNotFound) {
                [formErrors addObject:@"Name must contain letters and spaces only."];
                errorCount++;
            }
        }

    }
}

if (textField == [self ageField]) {

    if ( ([[textField text] isEqualToString:@""]) ) {
        [formErrors addObject:@"How old are you?"];
        errorCount++;
    } else {
        errorCount--;
        if ( ([[textField text] intValue]) < 1 || ([[textField text] intValue] > 120) ) {
            [formErrors addObject:@"Please enter an age using a number between 1 and 120."];
            errorCount++;
        } else {
            errorCount--;
            if ([[textField text] rangeOfCharacterFromSet:numericSet].location != NSNotFound) {
                [formErrors addObject:@"Age must be given in numbers."];
                errorCount++;
            }

        }
    }
}

我的实例变量:

{
    NSMutableArray *formErrors;
}

然后在viewDidLoad:中初始化

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    formErrors = [[NSMutableArray alloc] init];

然后在prepareForSegue: 我有一些临时代码来检查一切是否正常:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    int errCount = [formErrors count];
    // check if all textfield values are filled in if not then disallow form submit
    for (NSString *error in formErrors) {
        NSLog(@"Total %d errors, \n Error Message: %@", errCount, error);
    }

我要做的就是在输入和离开字段时检查是否有任何错误;如果有,只需将错误消息存储在formErrors 中,这样我就可以在prepareForSegue: 中做我需要做的事情。这甚至是正确的方法吗?我尝试过很多不同的方法,但只是继续循环。

提交按钮链接到我的 segue,也是一个出口,所以我可以随意启用和禁用它。

帮助将不胜感激 亲切的问候

【问题讨论】:

    标签: objective-c forms cocoa-touch ios7 uitextfield


    【解决方案1】:

    你的方法有点多余。提交时验证您的字段,如果有任何错误则取消提交:

    - (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
      NSMutableArray *errors = [NSMutableArray array];
    
      if (self.nameTextField.text.length > 21) {
        [errors addObject:@"Name cannot be longer than 21 symbols"];
      }
      else if (!self.nameTextField.text.length) {
        [errors addObject:@"Please enter your name"];
      }
    
      if (!self.passwordTextField.text.length) {
        [errors addObject:@"Please enter password"];
      }
      else if (!self.confirmPasswordTextField.text.length) {
        [errors addObject:@"Please confirm your password"];
      }
      else if (self.passwordTextField.text.length < 6) {
        [errors addObject:@"Password is too short, use at least 6 characters."];
      }
      else if (![self.passwordTextField.text isEqualToString:self.confirmPasswordTextField.text]) {
        [errors addObject:@"Passwords do not match"];
      }
    
      if (!self.emailTextField.text.length) {
        [errors addObject:@"Please enter your e-mail"];
      }
    
      if (!self.image) {
        [errors addObject:@"Please choose a photo"];
      }
    
      if (errors.count) {
        [[[UIAlertView alloc] initWithTitle:@"Error"
                                    message:[errors componentsJoinedByString:@"\n"]
                                   delegate:nil
                          cancelButtonTitle:@"OK"
                          otherButtonTitles:nil, nil] show];
        return NO;
      }
      return YES;
    }
    

    【讨论】:

    • 我认为这种技术是一种更好的验证方式。这样,验证只在一个地方完成,而不必在所有地方进行管理。如果其他视图具有公共字段,也可以将其移到其自己的对象中并重新用于公共验证。
    • 这其实让我觉得有点奇怪。我已经实现了这一点,可以继续前进。它工作正常。一直以来,我都希望有这样的解决方案。如果我阅读了更多关于 segue 的内容,我会遇到这种方法。吸取教训,谢谢。
    【解决方案2】:

    您走在正确的道路上,但这里有几点意见。

    1. 首先,我将删除所有 errorCount++errorCount-- 行。它们没有意义,因为您始终可以计算错误数组中的项目。

    2. 每次检查输入字段时,请清除错误数组,否则您将遇到可能已经更正的错误。

    3. 在您的-(void)textFieldDidEndEditing:(UITextField *)textField 方法中,不要只检查已编辑的文本字段,因为您需要跟踪之前的错误、已更正的错误和新的错误。 ..太麻烦了。

    我认为最好创建一个新方法来检查所有信息并返回一组错误。从textFieldDidEndEditing 调用此例程。

    - (NSArray *)checkInputs
    {
        NSMutableArray *errors = [NSMutableArray array];
        // Loop through the textfields and fill your array
        return (NSArray *)errors;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-05-24
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 2014-04-17
      • 1970-01-01
      • 2013-12-25
      相关资源
      最近更新 更多