2015-11-26 3 views
0

У меня есть TextField для IP-адреса. В настоящее время я проверка моего IP-адрес по нажатию кнопки, как это:iOS: Принудительно ввести пользователя для ввода действительного IP-адреса при вводе текста TextField

- (IBAction)addPrinter:(id)sender { 

    NSString* validIPRegEx = @"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"; 
    NSRegularExpression *regex = [NSRegularExpression 
            regularExpressionWithPattern:validIPRegEx 
            options:0 
            error:nil]; 
    NSUInteger numberOfMatches = [regex numberOfMatchesInString:_printerIPAddress.text options:0 range:NSMakeRange(0, [_printerIPAddress.text length])]; 
    if (numberOfMatches!=1) { 
     UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:@"Error" 
                   message:@"Invalid IP Address" 
                  delegate:nil 
                cancelButtonTitle:@"OK" 
                otherButtonTitles: nil]; 
     [myAlertView show]; 
    } 
} 

Но, мое требование заключается в том, что я проверить мой IP-адрес на ходе, как пользователь вводит текст в TextField.

Например, когда пользователь запускает набрав в TextField он должен быть позволен ввести число от 0-255 перед любым из трех точек в качестве IP-адрес, т.е., если пользователь уже набрал 26, то текст не должен измените, если он набирает что-либо, кроме точки. Точно так же текст не должен меняться, если он набирает любой другой символ, кроме чисел и точек.

Я много искал об этом, но не нашел никакой помощи. Любая помощь в этом отношении будет оценена по достоинству.

Заранее благодарен!

+1

Ну, попробуйте [ '^ (([0-9] | [1-9] [0-9] | 1 [0-9] {2} | 2 [0-4] [0-9] | 25 [0-5])) {0,3} ([0-9] [.] | [1-9] [0-9] | 1 [0-9] {2} | 2 [0-4] [0-9] | 25 [0-5])? $ '] (https://regex101.com/r/xQ2xZ2/1). –

+0

Моя проблема связана не с регулярным выражением, а с тем, как я могу проверять частично типизированный IP-адрес каждый раз, когда пользователь вводит что-то в TextField. – Exception

+0

Я знаю, вы попробовали мое регулярное выражение для проверки этого? Я должен упомянуть, что вы не можете использовать одно и то же регулярное выражение для проверки * live * и * final *. Это невозможно. –

ответ

0
(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
............ 
} 

Выше этот метод сообщит вам, когда-либо пользователь нажимает клавишу, чтобы изменить текст, «вставить» вызовет несколько символов, чтобы быть в строке, забой по одному или удалить из выбора причинит строка должна быть пустой,

В этом разделе вы можете проверить диапазон символов 0-255.

Оригинальный ответ ниже.

Detecting whether the user has typed in a UITextField

0

Полный ответ представляет собой сочетание комментариев от stribizhev и Мухаммада ответа. Выше функциональность может быть реализована следующим образом:

  1. Сделайте ViewController UITextFieldDelegate путем добавления _textfiled.delegate=self;
  2. Реализовать -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string следующим образом:

    -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ 
    
        NSString* ipEntered; 
        if (![string isEqualToString:@""]) { 
    
         ipEntered=[NSString stringWithFormat:@"%@%@",[textfield.text substringToIndex: range.location],string]; 
        } 
    
        NSString* validIPRegEx = @"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]){0,3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])?$"; 
        NSPredicate * emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", validIPRegEx]; 
        if ([string isEqualToString:@""]) { 
    
         return YES; 
        } 
        else if ([emailTest evaluateWithObject:ipEntered]){ 
    
         return YES; 
    
        } 
        else{ 
    
         return NO; 
        } 
    
    
    } 
    
Смежные вопросы