web-dev-qa-db-fra.com

Iphone, Obtenir une liste des pays dans un NSArray

J'ai un menu qui permet à un utilisateur de sélectionner un pays. Exactement comme cela dans le menu pays de contacts.app dans le champ d'adresse. 

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 ne sont malheureusement que les codes de pays et non l'équivalent lisible par l'homme. Je ne veux pas de «GB», je veux la Grande-Bretagne.

43
Dan Morgan

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.

38
Chuck

Merci chuck.

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

Objectif 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:)];

Rapide:

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()
93
Dan Morgan

Vous voudrez peut-être définir les paramètres régionaux.
et il y a trop de mémoire libérée automatiquement, ce qui pourrait être critique, vous ne savez jamais. Créez donc également un pool autoreleased dans la boucle 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:)];
15
Mk.zRealDeal

Swift 3

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

Vous avez celui-ci travaillant sur les terrains de jeux

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

À peu près la même réponse que ci-dessus, utilise simplement flatMap pour être plus court et plus rapide.

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