четверг, 1 октября 2015 г.

28. UITextField. Part 2

Урок 28 - это продолжение предыдущего урока про поля ввода UITextField.
Видео урока находится по ссылке.
Предыдущее домашнее задание  было предназначено для этого урока.
В этом уроке рассмотрено форматирование поля телефон.
Вот текст функции форматирования:
Прокомментирую куски кода

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


Эта функция делегата вызывается перед тем как добавлять/удалять символы в текстовое поле

    
    //NSLog(@"textField text = %@", textField.text);
    //NSLog(@"shouldChangeCharactersInRange %@", NSStringFromRange(range));
    //NSLog(@"replacementString %@", string);

textField.text содержит значение поля, без вновь введенных символов
range - переменная содержит место и количество символов (в случае замены больше нуля) куда в text.Field.text будет вставлена вновь введенная подстрока  string
    
    NSCharacterSet* validationSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];

Создается свой список символо на основе существующего сета с десятичными символами decimalDigitCharacterSet путем инвертирования (invertedSet).

    NSArray* components = [string componentsSeparatedByCharactersInSet:validationSet];
    
    if ([components count] > 1) {
        return NO;
    }

Вновь введенный символ или вставленная строка нарезается в массив используя разделители - недопустимые символы (недесятичные числа). Если встретился хоть один разделитель - недопустимый символ, то компонентов в массиве будет больше 1. Соответственно вставлять такую подстроку ненужно

    
    NSString* newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
    
Подстрока вклеивается в нужное место текстового поля в соответствии с range.

    //+XX (XXX) XXX-XXXX
    
    NSLog(@"new string = %@", newString);
    
    NSArray* validComponents = [newString componentsSeparatedByCharactersInSet:validationSet];

Новая строка (со вставленной подстрокой) нарезается в массив используя в качестве разделителя  недопустимые символы
    
    newString = [validComponents componentsJoinedByString:@""];

Вновь массив сливается в строку (уже с вырезанными недопустимыми символами).
    
Далее идет форматирования в зависимости от длинны строки - добавляются скобки, разделитель - .


    // XXXXXXXXXXXX
    
    NSLog(@"new string fixed = %@", newString);
    
    static const int localNumberMaxLength = 7;
    static const int areaCodeMaxLength = 3;
    static const int countryCodeMaxLength = 3;
    
    if ([newString length] > localNumberMaxLength + areaCodeMaxLength + countryCodeMaxLength) {
        return NO;
    }
    
    
    NSMutableString* resultString = [NSMutableString string];
    
    /*
     XXXXXXXXXXXX
    +XX (XXX) XXX-XXXX
    */
   
    NSInteger localNumberLength = MIN([newString length], localNumberMaxLength);
    
    if (localNumberLength > 0) {
        
        NSString* number = [newString substringFromIndex:(int)[newString length] - localNumberLength];
        
        [resultString appendString:number];
        
        if ([resultString length] > 3) {
            [resultString insertString:@"-" atIndex:3];
        }
        
    }
    
    if ([newString length] > localNumberMaxLength) {
        
        NSInteger areaCodeLength = MIN((int)[newString length] - localNumberMaxLength, areaCodeMaxLength);
        
        NSRange areaRange = NSMakeRange((int)[newString length] - localNumberMaxLength - areaCodeLength, areaCodeLength);
        
        NSString* area = [newString substringWithRange:areaRange];
        
        area = [NSString stringWithFormat:@"(%@) ", area];
        
        [resultString insertString:area atIndex:0];
    }
    
    if ([newString length] > localNumberMaxLength + areaCodeMaxLength) {
        
        NSInteger countryCodeLength = MIN((int)[newString length] - localNumberMaxLength - areaCodeMaxLength, countryCodeMaxLength);
        
        NSRange countryCodeRange = NSMakeRange(0, countryCodeLength);
        
        NSString* countryCode = [newString substringWithRange:countryCodeRange];
        
        countryCode = [NSString stringWithFormat:@"+%@ ", countryCode];
        
        [resultString insertString:countryCode atIndex:0];
    }
    
    
    textField.text = resultString;
    
    return NO;
    
    
    
    //NSCharacterSet* set = [NSCharacterSet characterSetWithCharactersInString:@" ,?"];
    /*
    NSCharacterSet* set = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
    NSArray* words = [resultString componentsSeparatedByCharactersInSet:set];
    NSLog(@"words = %@", words);
     
     
    return [resultString length] <= 10;
    */
    
}

Исходный текст урока
Вставил функцию форматирования телефона в предыдущее домашнее задание:
Ссылка на домашнее задание 28 (27 с функцией из урока)


Комментариев нет:

Отправить комментарий