Проверка TextField с регулярным выражением - PullRequest
11 голосов
/ 23 апреля 2011

Мне нужна помощь с кодом, который просматривает текстовое поле, убедитесь, что оно начинается с (+ или -), а затем содержит 3 целых числа.

Итак, действительные данные выглядят как +234 или -888

Итак, я запустил этот код, но есть 2 проблемы с ним

  1. Правильно проверяется, что введены только 4 символа. Но по какой-то причине вам нужно убрать фокус с текстового поля, чтобы кнопка «Готово» на клавиатуре сработала и скрыла клавиатуру. Если я поместил в текстовое поле менее 4 символов, кнопка «Готово» работает нормально. Но я не хочу, чтобы пользователь вводил что-либо, кроме 4 символов, а затем нажимал «Готово» и скрывал клавиатуру. Вот первая проблема ....

  2. Я не знаком с регулярными выражениями и как их использовать в iphone. Поэтому мне нужно добавить в этот код регулярное выражение для вышеуказанного требования.

    -(BOOL)textField:(UITextField*)textFieldshouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
         NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
         return !([newString length] > 4);
    }
    //Done button to hide the keyboard
    -(IBAction)Done:(id)sender
    {
    
    }
    

Ответы [ 4 ]

31 голосов
/ 26 апреля 2011

Я не уверен, как вы хотели бы обрабатывать пользовательский ввод и обратную связь.Сначала я покажу простой способ держать пользователя в режиме редактирования textField, если его ввод недопустим.

Прежде всего два метода делегата:

- (BOOL)textFieldShouldReturn:(UITextField *)aTextField
{
    [aTextField resignFirstResponder];
    return YES;
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)aTextField
{
    return [self validateInputWithString:aTextField.text];
}

Метод тестирования, который просто возвращает ДА ​​или НЕТ независимо от того, действителен ли ввод:

- (BOOL)validateInputWithString:(NSString *)aString
{
    NSString * const regularExpression = @"^([+-]{1})([0-9]{3})$";
    NSError *error = NULL;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regularExpression
                                                                           options:NSRegularExpressionCaseInsensitive
                                                                             error:&error];
    if (error) {
        NSLog(@"error %@", error);
    }

    NSUInteger numberOfMatches = [regex numberOfMatchesInString:aString
                                                        options:0
                                                          range:NSMakeRange(0, [aString length])];
    return numberOfMatches > 0;
}

Вот и все.Тем не менее, я бы порекомендовал показать какой-либо статус в реальном времени для пользователя, независимо от того, в порядке ли он.Добавьте следующее уведомление, например, в свой метод viewDidLoad:

- (void)viewDidLoad
{
    // ...
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(validateInputCallback:) 
                                                 name:@"UITextFieldTextDidChangeNotification" 
                                               object:nil];
}

- (void)validateInputCallback:(id)sender
{
    if ([self validateInputWithString:textField.text]) {
        // For example turn a label green and let it say: "OK"
    } else {
        // For example turn a label red and let it say: "Allowed: + or minus followed by exactly three digits"
    }
}

Наконец: Если вам нужен доступ к группам захвата (+ или - и число) регулярного выражения,следующий код поможет:

// ... reg ex creation ...
NSArray *matches = [regex matchesInString:aString
                                  options:0
                                    range:NSMakeRange(0, [aString length])];

for (NSTextCheckingResult *match in matches) {
    for (int i = 0; i < [match numberOfRanges]; i++) {
        NSLog(@"range %d: %d %d", i, [match rangeAtIndex:i].location, [match rangeAtIndex:i].length);
        NSLog(@"substring %d: %@", i, [aString substringWithRange:[match rangeAtIndex:i]]);
    }
}
10 голосов
/ 26 апреля 2011

Подтвердить Электронная почта id или Телефон номер с использованием Регулярное выражение

Методы делегирования:

- (BOOL)textFieldShouldReturn:(UITextField *)aTextField
{
    [aTextField resignFirstResponder];
    return YES;
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)aTextField
{
    return [self validateEmail:aTextField.text]; // Change validateEmail to validatePhone for phone validation.
}

Возвращает ДА ​​или НЕТ независимо от того, действителен ли ввод:

- (BOOL) validateEmail: (NSString *) candidate {
    NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; 
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; 

    return [emailTest evaluateWithObject:candidate];
}

- (BOOL) validatePhone: (NSString *) candidate {
    NSString *phoneRegex = @"^+(?:[0-9] ?){6,14}[0-9]$"; 
    NSPredicate *phoneTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", phoneRegex]; 

    return [phoneTest evaluateWithObject:candidate];
}
3 голосов
/ 26 апреля 2011

Вместо этого используйте UIPickerView

Я отклоняюсь от названия вопроса, но ИМХО, учитывая то, что вам нужно, может быть лучше использовать UIPickerView для ввода типа «вращающееся колесо», как вы делаете вПриложение часов при настройке будильника.Он может начинаться с "+000", и пользователь может переключать некоторые из четырех колес ([+ -]. [0-9], [0-9], [0-9]) по мере необходимости

0 голосов
/ 23 апреля 2011

Реализуйте -textField:shouldChangeCharactersInRange:replacementString в вашем UITextFieldDelegate и используйте NSRegularExpression для подтверждения изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...