2009-02-02 4 views
42

У меня есть меню, позволяющее выбрать страну. Точно так же в меню countrys.app в поле адреса.Iphone, Получение списка в NSArray

Кто-нибудь знает простой способ получить список стран? Я использовал NSLocale для создания массива стран, но, к сожалению, это только коды стран, а не человекочитаемый эквивалент. Я не хочу «GB», я хочу Великобританию.

+0

Это не работает с прошивкой 8.1 Simulator см этот пост: - http://stackoverflow.com/questions/26613011/xcode-6-1-ios-8-1-nslocale-displaynameforkey-nslocaleidentifier-return-nil –

ответ

38

Используйте [[NSLocale currentLocale] displayNameForKey:NSLocaleCountryCode value:countryCode] (где countryCode - это элемент в вашем списке кодов стран), чтобы получить название страны в текущей локали пользователя.

90

Спасибо, патрон.

Если кому-то интересно или захотелось найти то же самое решение, вот мой код для отсортированного массива стран.

Objective-C:

NSLocale *locale = [NSLocale currentLocale]; 
NSArray *countryArray = [NSLocale ISOCountryCodes]; 

NSMutableArray *sortedCountryArray = [[NSMutableArray alloc] init]; 

for (NSString *countryCode in countryArray) { 

    NSString *displayNameString = [locale displayNameForKey:NSLocaleCountryCode value:countryCode]; 
    [sortedCountryArray addObject:displayNameString]; 

} 

[sortedCountryArray sortUsingSelector:@selector(localizedCompare:)]; 

Swift:

let locale = NSLocale.currentLocale() 
let countryArray = NSLocale.ISOCountryCodes() 
var unsortedCountryArray:[String] = [] 
for countryCode in countryArray { 
    let displayNameString = locale.displayNameForKey(NSLocaleCountryCode, value: countryCode) 
    if displayNameString != nil { 
     unsortedCountryArray.append(displayNameString!) 
    } 
} 
let sortedCountryArray = sorted(unsortedCountryArray, <) 

Swift 3

let locale = NSLocale.current 
    let unsortedCountries = NSLocale.isoCountryCodes.map { locale.localizedString(forRegionCode: $0)! } 
    let sortedCountries = unsortedCountries.sorted() 
+0

Возможно, вы захотите инициализировать 'sortedCountryArray' с емкостью' countryArr ay.count'. – DeFrenZ

15

Вы можете определить ло cale ..
и есть слишком много автореализованной памяти, которая может быть критической, вы никогда не знаете. поэтому создайте автореализованный пул внутри цикла for. Я это:

NSMutableArray * countriesArray = [[NSMutableArray alloc] init]; 
NSLocale *locale = [[[NSLocale alloc] initWithLocaleIdentifier: @"en_US"] autorelease]; 

NSArray *countryArray = [NSLocale ISOCountryCodes]; 
for (NSString *countryCode in countryArray) 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    NSString *displayNameString = [locale displayNameForKey:NSLocaleCountryCode value:countryCode]; 
    [countriesArray addObject:displayNameString]; 
    [pool release]; 

} 

[countriesArray sortUsingSelector:@selector(compare:)]; 
0

Практически тот же ответ, как и выше, использует только flatMap быть короче и swiftier.

let locale = NSLocale.currentLocale() 
var countries = NSLocale.ISOCountryCodes().flatMap { countryCode in 
    return locale.displayNameForKey(NSLocaleCountryCode, value: countryCode) 
} 
countries.sortInPlace() 
2

Swift 3

let locale = Locale.current 
let countries = Locale.isoRegionCodes.map { 
    locale.localizedString(forRegionCode: $0)! 
}.sorted() 
0

Got это один работает на игровых площадках

let locale = NSLocale(localeIdentifier: "FI") 
let unsortedCountries = NSLocale.isoCountryCodes.flatMap { locale.localizedString(forCountryCode: $0) } 
let sortedCountries = unsortedCountries.sorted() 
Смежные вопросы