2015-08-26 3 views
4

Насколько нам известно, в англоговорящей стране люди всегда записывают свои имена в формате «FirstName MiddleName LastName», например «Steven Paul Jobs». Однако на каком-то другом языке он отличается, например, в Китае, люди обычно пишут имя как «LastName FirstName». Я хочу узнать что-то в «NSLocale Class Reference», но это не очень помогло мне. Я знаю, что я могу сделать «switch case» от NSLocaleCountryCode, но я не знаю привычки каждой страны. Итак, есть ли лучший способ решить проблемы с именем? Спасибо за помощь.Упоминание порядка имен в iOS о NSLocale

ответ

3

Да, есть набор для этого написанного Mattt, который разработал Afnetworking:

TTTNameFormatter

имена TTTNameFormatter форматов по интернационализации стандартов рамок AddressBook, которые определяют, например, порядок отображения имен и разграничение компонентов с пробелами.

TTTNameFormatter is not available on OS X. 

Пример

TTTNameFormatter *nameFormatter = [[TTTNameFormatter alloc] init]; 
NSString *frenchName = [nameFormatter stringFromPrefix:nil firstName:@"Guillaume" middleName:@"François" lastName:@"Antoine" suffix:@"Marquis de l'Hôpital"]; 
NSLog(@"%@", frenchName); 
// "Guillaume François Antoine Marquis de l'Hôpital" 

NSString *japaneseName = [nameFormatter stringFromFirstName:@"孝和" lastName:@"関"]; 
NSLog(@"%@", japaneseName); 
// "関孝和" 

получить его здесь:

https://github.com/mattt/FormatterKit

1

Вы можете использовать рамки AddressBook, чтобы получить заказ имя. Просто добавьте его в проект и сделать #import "AddressBookUI/AddressBookUI.h", а затем вы можете использовать этот метод, например:

- (NSString*)localNameFormatterWithFirstName:(NSString*)firstName middleName:(NSString*)middleName andLastName:(NSString*)lastName { 
    ABRecordRef record = ABPersonCreate(); 
    ABRecordSetValue(record, kABPersonFirstNameProperty, (__bridge CFStringRef)firstName, NULL); 
    ABRecordSetValue(record, kABPersonMiddleNameProperty, (__bridge CFStringRef)middleName, NULL); 
    ABRecordSetValue(record, kABPersonLastNameProperty, (__bridge CFStringRef)lastName, NULL); 
    NSString *displayName = (__bridge_transfer NSString*)ABRecordCopyCompositeName(record); 
    CFRelease(record); 
    return displayName; 
} 

Любой аргумент, который равен нулю, будет проигнорировано.

+0

Большое спасибо. TTTNameFormatter также основан на AddressBookUI, он действительно работает. (Тем не менее, я слышал, что AddressBookUI будет устаревшим в iOS9. Кажется, мне нужно написать еще одну версию If/Else о версии iOS.) –

5

Эта функциональность была добавлена ​​в Foundation.framework. Совместимость с iOS9 +.

Я еще не вижу его в документации, но он находится в файлах заголовков, и вы можете использовать его на Swift Playground.

Детальная информация об этой проблеме содержится в WWDC 2015 Session 227 (около 22 минут). В этом сеансе они говорят о NSPersonNameComponents и NSPersonNameComponentsFormatter.

Пример:

let components = NSPersonNameComponents() 
components.namePrefix = "Mrs." 
components.givenName = "Grace" 
components.middleName = "Murray" 
components.familyName = "Hopper" 

NSPersonNameComponentsFormatter.localizedStringFromPersonNameComponents(
    components, style: .Default, options: []) 
Смежные вопросы