Уроки iPhone SDK: (Часть 1) Локализация приложений для iPhone Уроки iPhone SDK: (Часть 3) Локализация приложений iPhone: интернационализация.
Май 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];
}

Телефонный номер и локаль будут выведены в окне отладчика.

Заключение.

Создание пользовательского форматера актуально в тех случаях, когда нужно отображать и форматировать данные (например, телефонные номера) в соответствии с параметрами пользовательской локали. Это помогает избежать в коде лишнего. Удачи!

Исходный код скачать можно [здесь]

Текст оригинальной статьи на английском языке [здесь]

Уважаемые читатели, данный материал был переведен и подготовлен к публикации проектом LookApp.ru, при публикации на другом сайте ссылка на LookApp.ru обязательна.

1 звезда2 звезд3 звезд4 звезд5 звезд (Оцените приложение)
Загрузка ... Загрузка ...


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