2012-06-19 12 views
18

Mi chiedevo se fosse possibile ottenere le abbreviazioni di stato da CLPlacemark?CLPlacemark - Abbreviazioni di stato?

In riferimento CLPlacemark da Apple afferma:

administrativeArea Lo stato o provincia associati con il segnaposto. (sola lettura) @property (nonatomico, readonly) NSString * administrativeArea Discussione Se la posizione del segnaposto è la sede principale di Apple, ad esempio, il valore per questa proprietà sarà la stringa "CA" o "California".

ma ogni volta che lo uso, ottengo solo lo stato completo (cioè California) e non l'abbreviazione (cioè CA). Qualcuno può aiutarmi qui?

+1

Il [CLPlacemark-StateAbbreviation] (https://github.com/jweyrich/CLPlacemark-StateAbbreviation) fa esattamente questo. – jweyrich

risposta

32

Per chiunque altro abbia bisogno di una soluzione per questo, ho creato una classe di classe per CLPlacemark che restituisce la stringa di stato breve. Tutto quello che dovete fare è chiamare myPlacemark shortState

CLPlacemark + ShortState.h

#import <CoreLocation/CoreLocation.h> 
#import <Foundation/Foundation.h> 

@interface CLPlacemark (ShortState) 

- (NSString *)shortState; 

@end 

CLPlacemark + ShortState.m

#import "CLPlacemark+ShortState.h" 

@interface CLPlacemark (ShortStatePrivate) 

- (NSDictionary *)nameAbbreviations; 

@end 

@implementation CLPlacemark (ShortState) 

- (NSString *)shortState { 

    NSString *state = [self.administrativeArea lowercaseString]; 

    if (state.length==0) 
     return nil; 

    return [[self nameAbbreviations] objectForKey:state]; 

} 

- (NSDictionary *)nameAbbreviations { 

    static NSDictionary *nameAbbreviations = nil; 

    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 

     nameAbbreviations = [NSDictionary dictionaryWithObjectsAndKeys: 
          @"AL",@"alabama", 
          @"AK",@"alaska", 
          @"AZ",@"arizona", 
          @"AR",@"arkansas", 
          @"CA",@"california", 
          @"CO",@"colorado", 
          @"CT",@"connecticut", 
          @"DE",@"delaware", 
          @"DC",@"district of columbia", 
          @"FL",@"florida", 
          @"GA",@"georgia", 
          @"HI",@"hawaii", 
          @"ID",@"idaho", 
          @"IL",@"illinois", 
          @"IN",@"indiana", 
          @"IA",@"iowa", 
          @"KS",@"kansas", 
          @"KY",@"kentucky", 
          @"LA",@"louisiana", 
          @"ME",@"maine", 
          @"MD",@"maryland", 
          @"MA",@"massachusetts", 
          @"MI",@"michigan", 
          @"MN",@"minnesota", 
          @"MS",@"mississippi", 
          @"MO",@"missouri", 
          @"MT",@"montana", 
          @"NE",@"nebraska", 
          @"NV",@"nevada", 
          @"NH",@"new hampshire", 
          @"NJ",@"new jersey", 
          @"NM",@"new mexico", 
          @"NY",@"new york", 
          @"NC",@"north carolina", 
          @"ND",@"north dakota", 
          @"OH",@"ohio", 
          @"OK",@"oklahoma", 
          @"OR",@"oregon", 
          @"PA",@"pennsylvania", 
          @"RI",@"rhode island", 
          @"SC",@"south carolina", 
          @"SD",@"south dakota", 
          @"TN",@"tennessee", 
          @"TX",@"texas", 
          @"UT",@"utah", 
          @"VT",@"vermont", 
          @"VA",@"virginia", 
          @"WA",@"washington", 
          @"WV",@"west virginia", 
          @"WI",@"wisconsin", 
          @"WY",@"wyoming", 
          nil]; 
    }); 

    return nameAbbreviations; 
} 

@end 
+1

Grazie! Penso che questo potrebbe essere davvero utile per usi futuri/visitatori che vedono questo! – sridvijay

+1

Grazie per aver accettato così tanto dopo la domanda originale ... si spera che sia utile a qualcuno. – ChrisH

+2

Ehi, l'ho trasformato in un plist che include anche le province canadesi. Un po 'più pulito + puoi aggiungerne altri (basta caricare il dizionario da un file invece di scriverlo nel codice). Questo metodo è comunque ottimo. http://cl.ly/3c0W1s3E1J1Y – shim

3

Credo che la documentazione sia errata. L'area amministrativa restituirà sempre il nome completo dello stato per i luoghi negli Stati Uniti. Per ottenere l'abbreviazione dello stato è molto probabile che tu debba creare una tabella di ricerca del dizionario in modo che la ricerca della chiave "California" ti restituisca il valore "CA".

6

penso che non è possibile ottenere le abbreviazioni degli stati, ma si può fare la propria classe per questo ..

  • Elenco di tutti gli stati (Stati sono standard)
  • confrontare tali Stati e ritorno l'abbreviazione

Codice ..

Classe StateAbbreviation

StateAbbreviation.h

@interface StateAbbreviation : NSString { 

} 

+ (NSString *)allStates:(int)index; 
+ (NSString *)abbreviatedState:(NSString *)strState; 

@end 

StateAbbreviation.m

@implementation StateAbbreviation 
+ (NSString *)allStates:(NSString *)strState { 
    // Remove all space on the string 
    strState = [strState stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    //Sample states 
    NSArray *states = [[NSArray alloc] initWithObjects: 
         @"ALABAMA",      
         @"ALASKA",  //AK 
         @"AMERICANSAMOA", //AS 
         @"ARIZONA",  //AZ 
         @"ARKANSAS",  //AR 
         @"CALIFORNIA", //CA 
         nil]; 
    NSUInteger n = [states indexOfObject:strState]; 
    if (n > [states count] - 1) { 
    strAbbreviation = @"NOSTATE"; 
    } 
    else { 
    strAbbreviation =[self abbreviatedState:n]; 
    } 
    [states release]; 
    return strAbbreviation; 
} 

+ (NSString *)abbreviatedState:(int)index { 
    NSArray *states = [[NSArray alloc] initWithObjects: 
         @"AL", 
         @"AK", 
         @"AS", 
         @"AZ", 
         @"AR", 
         @"CA", 
         nil]; 
     NSString *strAbbreviation = [states objectAtIndex:index]; 
     [states release]; 
     return strAbbreviation; 
} 
@end 

Quando si chiama la classe dovrebbe essere qualcosa di simile

NSString *upperCase = [@"California" uppercaseString]; // California could be from (NSString *)placemark.administrativeArea; 
NSString *abbr = [StateAbbreviation allStates:upperCase]; 
NSLog(@"%@", abbr); // Result should be CA 

Questo sono soltanto campioni è possibile la ricerca di tutti gli Stati qualcosa come questo, states and their abbreviations piace anche questo states and their abbreviations

+1

Grazie! Ma potresti aggiornare il codice per mostrare come implementarlo con l'Area amministrativa? Lo metto in qualcosa come objectForKey o qualcosa del genere? Sono un po 'confuso su come farlo. Grazie per la risposta! – sridvijay

+0

controlla il codice sopra – dianz

+0

Grazie per l'aggiornamento ma ottengo 2 errori mentre lo faccio. 1. Variabile di istanza 'strAbbreviation' accessibile nel metodo di classe. 2. La conversione implicita di NSUInteger in NSString * non è consentita in ARC. Ho preso le dichiarazioni di rilascio per farlo funzionare in ARC, ma non so come risolvere questi 2. Grazie. Per l'aiuto, lo apprezzo. – sridvijay

1

Ecco un'altra categoria usando FormattedAddressLines, restituisce un risultato come la California, CA

-(NSString *) stateWithAbbreviation { 
if ([[self.addressDictionary objectForKey:@"CountryCode"] isEqualToString:@"US"] && self.addressDictionary) { 
    NSDictionary *addressLines = [self.addressDictionary objectForKey:@"FormattedAddressLines"]; 
    for (NSString* addressLine in addressLines) { 
     NSRange stateRange = [addressLine rangeOfString:self.postalCode options:NSCaseInsensitiveSearch]; 
     if (stateRange.length > 0) { 
      NSRange lastSpace = [addressLine rangeOfString:@" " options:NSBackwardsSearch]; 
      if (lastSpace.length > 0) { 
       NSString *state = [[addressLine substringToIndex:lastSpace.location] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
       lastSpace = [state rangeOfString:@" " options:NSBackwardsSearch]; 
       if (lastSpace.length > 0) { 
        NSString *abbr = [[state substringFromIndex:lastSpace.location] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
        return [NSString stringWithFormat:@"%@, %@", self.administrativeArea, abbr]; 
       } 
      } 
     } 
    } 
} 
return self.administrativeArea; 
} 

Non perfetto ma funziona fintanto che Apple cha nge il formato delle linee di indirizzo che penso.

1

Per le persone che hanno bisogno della lista di stato con gli oggetti e le chiavi scambiati (ad esempio su iOS 7 ottengo "CA" dal placemark.administrativeArea):

NSDictionary *nameAbbreviations = [NSDictionary dictionaryWithObjectsAndKeys: 
    @"alabama",@"AL", 
    @"alaska",@"AK", 
    @"arizona",@"AZ", 
    @"arkansas",@"AR", 
    @"california",@"CA", 
    @"colorado",@"CO", 
    @"connecticut",@"CT", 
    @"delaware",@"DE", 
    @"district of columbia",@"DC", 
    @"florida",@"FL", 
    @"georgia",@"GA", 
    @"hawaii",@"HI", 
    @"idaho",@"ID", 
    @"illinois",@"IL", 
    @"indiana",@"IN", 
    @"iowa",@"IA", 
    @"kansas",@"KS", 
    @"kentucky",@"KY", 
    @"louisiana",@"LA", 
    @"maine",@"ME", 
    @"maryland",@"MD", 
    @"massachusetts",@"MA", 
    @"michigan",@"MI", 
    @"minnesota",@"MN", 
    @"mississippi",@"MS", 
    @"missouri",@"MO", 
    @"montana",@"MT", 
    @"nebraska",@"NE", 
    @"nevada",@"NV", 
    @"new hampshire",@"NH", 
    @"new jersey",@"NJ", 
    @"new mexico",@"NM", 
    @"new york",@"NY", 
    @"north carolina",@"NC", 
    @"north dakota",@"ND", 
    @"ohio",@"OH", 
    @"oklahoma",@"OK", 
    @"oregon",@"OR", 
    @"pennsylvania",@"PA", 
    @"rhode island",@"RI", 
    @"south carolina",@"SC", 
    @"south dakota",@"SD", 
    @"tennessee",@"TN", 
    @"texas",@"TX", 
    @"utah",@"UT", 
    @"vermont",@"VT", 
    @"virginia",@"VA", 
    @"washington",@"WA", 
    @"west virginia",@"WV", 
    @"wisconsin",@"WI", 
    @"wyoming",@"WY", 
    nil]; 
1

Come di almeno iOS 8, CLPlacemark 's administrativeArea restituisce un abbreviazione di due lettere per Stati Uniti.

Non è necessario estendere CLPlacemark con una categoria come quella nella risposta accettata a condizione che si scelga come target iOS 8 e successivi (che si dovrebbe avere ormai).

CLGeocoder *geocoder = [[CLGeocoder alloc] init]; 
[geocoder geocodeAddressString:@"1 Infinite Loop, Cupertino, CA" completionHandler:^(NSArray *placemarks, NSError *error) { 
    CLPlacemark *placemark = [placemarks firstObject]; 
    NSLog(@"State: %@", placemark.administrativeArea); 
}]; 

Esegui questo e si otterrà:

State: CA 
+1

Questa non è una dichiarazione vera almeno secondo i documenti più recenti che Apple ha a disposizione: La stringa in questa proprietà può essere il nome specificato dell'area amministrativa o la sua abbreviazione designata, se ne esiste uno. Se la posizione del segnaposto è la sede principale di Apple, ad esempio, il valore per questa proprietà sarà la stringa "CA" o "California". –