Ответ 1
Используйте [[NSLocale currentLocale] displayNameForKey:NSLocaleCountryCode value:countryCode]
(где countryCode - это элемент в вашем списке кодов стран), чтобы получить имя страны в текущей локали пользователя.
У меня есть меню, позволяющее пользователю выбрать страну. Точно так же в меню countrys.app в поле адреса.
Кто-нибудь знает простой способ получить список стран? Я использовал NSLocale для создания массива стран, но, к сожалению, он относится только к кодам стран, а не к человекообразному эквиваленту. Я не хочу "ГБ", я хочу Великобританию.
Используйте [[NSLocale currentLocale] displayNameForKey:NSLocaleCountryCode value:countryCode]
(где countryCode - это элемент в вашем списке кодов стран), чтобы получить имя страны в текущей локали пользователя.
Спасибо, патрон.
Если кто-то заинтересован или хочет найти такое же решение, это мой код для отсортированного массива стран.
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()
Возможно, вы захотите определить локаль..
и слишком много автореализованной памяти, которая может быть критической, вы никогда не знаете. поэтому создайте автореализованный пул внутри цикла 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:)];
Swift 3
let locale = Locale.current
let countries = Locale.isoRegionCodes.map {
locale.localizedString(forRegionCode: $0)!
}.sorted()
В значительной степени тот же ответ, что и выше, просто использует flatMap
для того, чтобы быть короче и быстрее.
let locale = NSLocale.currentLocale()
var countries = NSLocale.ISOCountryCodes().flatMap { countryCode in
return locale.displayNameForKey(NSLocaleCountryCode, value: countryCode)
}
countries.sortInPlace()
Получил этот, работающий на игровых площадках
let locale = NSLocale(localeIdentifier: "FI")
let unsortedCountries = NSLocale.isoCountryCodes.flatMap { locale.localizedString(forCountryCode: $0) }
let sortedCountries = unsortedCountries.sorted()