2009-02-02 6 views
42

Ich habe ein Menü, mit dem ein Benutzer ein Land auswählen kann. Genau wie im Ländermenü von contacts.app country im Adressfeld.Iphone, Erhalte eine Liste von Ländern in einem NSArray

Kennt jemand eine einfache Möglichkeit, eine Liste von Ländern zu bekommen? Ich habe NSLocale verwendet, um eine Reihe von Ländern zu generieren, aber leider sind es nur die Ländercodes und nicht das menschenlesbare Äquivalent. Ich will nicht GB, ich will Großbritannien.

+0

Dies ist nicht mit iOS 8.1 arbeitet Simulator diesen Beitrag sehen: - http://stackoverflow.com/questions/26613011/xcode-6-1-ios-8-1-nslocale-displaynameforkey-nslocaleidentifier-return-nil –

Antwort

38

Verwenden Sie [[NSLocale currentLocale] displayNameForKey:NSLocaleCountryCode value:countryCode] (wobei countryCode ein Element in der Liste der Ländercodes ist), um den Namen des Landes im aktuellen Gebietsschema des Benutzers abzurufen.

90

Dank Chuck.

Wenn jemand interessiert ist oder die gleiche Lösung finden wollte, hier ist mein Code für eine sortierte Reihe von Ländern.

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

Sie möchten 'sortedCountryArray' mit der Kapazität von 'countryArr' initialisieren ay.count'. – DeFrenZ

15

Vielleicht möchten lo definieren cale ..
und es gibt zu viele Autoreleased Speicher, die kritisch sein könnten, wissen Sie nie. Erstellen Sie also einen automatisch freigegebenen Pool innerhalb der for-Schleife. Ich habe dies:

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

So ziemlich die gleiche Antwort wie oben, nur flatMap verwendet kürzer und swiftier zu sein.

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 dieses auf Spielplätzen arbeiten

let locale = NSLocale(localeIdentifier: "FI") 
let unsortedCountries = NSLocale.isoCountryCodes.flatMap { locale.localizedString(forCountryCode: $0) } 
let sortedCountries = unsortedCountries.sorted() 
Verwandte Themen