Урок 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 с функцией из урока)
Вставил функцию форматирования телефона в предыдущее домашнее задание:
Ссылка на домашнее задание 28 (27 с функцией из урока)
Комментариев нет:
Отправить комментарий