2009-02-02 17 views
42

J'ai un menu qui permet à un utilisateur de sélectionner un pays. Exactement comme ça dans le menu pays contacts.app dans le champ d'adresse.Iphone, Obtention d'une liste de pays dans un NSArray

Est-ce que quelqu'un connaît un moyen simple d'obtenir une liste de pays? J'ai utilisé NSLocale pour générer un éventail de pays, mais ce n'est que l'indicatif de pays malheureusement et pas l'équivalent humain lisible. Je ne veux pas 'GB' Je veux la Grande-Bretagne.

+0

Ce ne fonctionne pas avec iOS 8.1 Simulator voir ce post: - http://stackoverflow.com/questions/26613011/xcode-6-1-ios-8-1-nslocale-displaynameforkey-nslocaleidentifier-return-nil –

Répondre

38

Utilisez [[NSLocale currentLocale] displayNameForKey:NSLocaleCountryCode value:countryCode] (où countryCode est un élément de votre liste de codes de pays) pour obtenir le nom du pays dans les paramètres régionaux actuels de l'utilisateur.

90

Merci chuck.

Si quelqu'un est intéressé ou voulait trouver la même solution, voici mon code pour un tableau trié de pays.

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

Vous pouvez vouloir initialiser 'sortedCountryArray' avec une capacité de' countryArr ay.count'. – DeFrenZ

15

Vous pouvez définir lo cale ..
et il y a trop de mémoire autoeleased, ce qui pourrait être critique, vous ne savez jamais. Créez donc un pool autoreleased à l'intérieur de la boucle for. J'ai ceci:

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

A peu près la même réponse que ci-dessus, juste utilise flatMap être plus court et 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 celui-ci travaille sur les terrains de jeu

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