Iphone, получение списка стран в NSArray - PullRequest
43 голосов
/ 02 февраля 2009

У меня есть меню, которое позволяет пользователю выбрать страну. Точно так же, как это в меню страны contacts.app в поле адреса.

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

Ответы [ 6 ]

93 голосов
/ 02 февраля 2009

Спасибо, Чак.

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

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()
38 голосов
/ 02 февраля 2009

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

15 голосов
/ 07 апреля 2010

Возможно, вы захотите определить локаль ..
и слишком много памяти с автоматическим выпуском, которая может быть критической, вы никогда не знаете. поэтому создайте пул с автоматическим освобождением внутри цикла 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:)];
2 голосов
/ 13 октября 2016

Swift 3

let locale = Locale.current
let countries = Locale.isoRegionCodes.map {
    locale.localizedString(forRegionCode: $0)!
}.sorted()
0 голосов
/ 13 сентября 2017

Работаю на игровых площадках

let locale = NSLocale(localeIdentifier: "FI")
let unsortedCountries = NSLocale.isoCountryCodes.flatMap { locale.localizedString(forCountryCode: $0) }
let sortedCountries = unsortedCountries.sorted()
0 голосов
/ 13 мая 2016

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

let locale = NSLocale.currentLocale()
var countries = NSLocale.ISOCountryCodes().flatMap { countryCode in
    return locale.displayNameForKey(NSLocaleCountryCode, value: countryCode)
}
countries.sortInPlace()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...