|
Май
28
|
В этой статье мы создадим пользовательский форматер для отображения определенных локальных данных. В процессе урока нам предстоит создать новый класс для форматирования телефонных номеров с соответствии с параметрами пользовательской локали. Если локаль настроена на “en_US“, телефонные номера выводятся в виде 1(111)111-1111.
NSFormatter.
Первым шагом к пользовательскому форматеру станет создание нового класса, наследующего “NSFormatter“. В Xcode выполните File -> New File -> NSObject subclass. Свой файл я назвал “PhoneNumberFormatter“. Создаваемый класс наследует “NSObject“. Удалите лишнее и перестройте его на “NSFormatter“. В результате заголовочный файл будет выглядеть так:
1 2 3 4 5 6 7 8 9 10 11 12 | #import <UIKit/UIKit.h> @interface PhoneNumberFormatter : NSFormatter { NSLocale *locale; } @property (nonatomic, copy) NSLocale *locale; - (NSString *) stringFromPhoneNumber:(NSNumber *)aNumber; @end |
У нас есть свойство локали, предусматривающее отслеживание текущих настроек пользователя, и метод, принимающий “NSNumber” и возвращающий отображение строки.
Поскольку класс наследует “NSFormatter“, придется отменить три метода, а именно: “stringForObjectValue:(id)anObject”, “getObjectValue:(id)anObject forString:(NSString *)string errorDescription:(NSString *)error” и “attributedStringForObjectValue:(id)anObject withDefaultAttributes:(NSDictionary *)attributes“. Все эти методы крайне полезны при программировании в Mac OS X, где можно назначать ячейку объекту “NSFormatter” (я попробовал сделать это в редакторе IB на iPhone, но ничего не вышло). “stringForObjectValue” возвращает объект “NSString“, который в текстовом виде представляет значение ячейки. Два других метода актуальны при программировании на Mac OS X, а для iPhone практически бесполезны, поэтому подробно на них останавливаться не будем.
Вот как выглядят методы “initWithLocale” и “stringFromPhoneNumber“:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | - (void) initWithLocale { [super init]; locale = [NSLocale currentLocale]; } - (NSString *) stringFromPhoneNumber:(NSNumber *)aNumber { NSString *localeString = [locale localeIdentifier]; NSString *tempStr = [[NSString alloc] initWithString:@""]; NSRange range; range.length = 3; range.location = 3; //Телефонный номер 2032225200 возвращается как 1(203)222-5200 if([localeString compare:@"en_US"] == NSOrderedSame) { NSString *areaCode = [[aNumber stringValue] substringToIndex:3]; NSString *phone1 = [[aNumber stringValue] substringWithRange:range]; NSString *phone2 = [[aNumber stringValue] substringFromIndex:6]; tempStr = [NSString stringWithFormat:@"1(%@)%@-%@", areaCode, phone1, phone2]; } return tempStr; } |
В методе “initWithLocale” получаем текущую локаль пользователя и копируем ее во внутреннюю переменную. В “stringFromPhoneNumber” прописываем логику отображения текстового представления для значения “NSNumber“, основываясь на локали. Пример крайне прост, и я уверен, что есть лучшие способы анализа и вывода информации.
Обратимся к методу “stringForObjectValue“:
1 2 3 4 5 6 7 | - (NSString *) stringForObjectValue:(id)anObject { if(![anObject isKindOfClass:[NSNumber class]]) return nil; else return [self stringFromPhoneNumber:anObject]; } |
Сначала проверяем, относится ли объект к классу “NSNumber“. Если да, передаем управление сообщению “stringFromPhoneNumber“.
Вот как мы воспользуемся этим кодом в приложении:
1 2 3 4 5 6 7 8 9 10 11 12 | - (void)applicationDidFinishLaunching:(UIApplication *)application { NSNumber *phoneNumber = [NSNumber numberWithInt:1231231212]; PhoneNumberFormatter *pnf = [[PhoneNumberFormatter alloc] initWithLocale]; NSLog(@"Phone Number: %@ for locale: %@", [pnf stringFromPhoneNumber:phoneNumber], [[pnf locale] localeIdentifier]); [pnf release]; // Переписываем точку настройки после запуска приложения [window makeKeyAndVisible]; } |
Телефонный номер и локаль будут выведены в окне отладчика.
Заключение.
Создание пользовательского форматера актуально в тех случаях, когда нужно отображать и форматировать данные (например, телефонные номера) в соответствии с параметрами пользовательской локали. Это помогает избежать в коде лишнего. Удачи!



Последние комментарии
Подскажите пожалуйста… Вот...
Код не открывает страницы по простой причине -...