2012-06-19 20 views
18

Me preguntaba si era posible obtener las abreviaturas de estado de CLPlacemark?CLPlacemark - ¿Abreviaciones del estado?

en la referencia CLPlacemark de Apple afirma:

administrativeArea El estado o provincia asociado con la marca de posición. (solo lectura) @property (no atómico, de solo lectura) NSString * administrativeArea Discusión Si la ubicación de la marca de posición es la sede de Apple, por ejemplo, el valor de esta propiedad sería la cadena "CA" o "California".

pero cada vez que lo uso, solo obtengo el estado completo (es decir, California) y no la abreviatura (es decir, CA). ¿Me puede ayudar alguien?

+1

El [CLPlacemark-StateAbbreviation] (https://github.com/jweyrich/CLPlacemark-StateAbbreviation) hace exactamente eso. – jweyrich

Respuesta

32

Para cualquier otra persona que necesite una solución para esto, he creado una clase de categoría para CLPlacemark que devuelve la cadena de estado corta. Todo lo que necesita hacer es llamar 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

Gracias! ¡Creo que esto podría ser realmente útil para usuarios/visitantes futuros que ven esto! – sridvijay

+1

Gracias por aceptar esto tanto tiempo después de la pregunta original ... espero que sí sea útil para alguien. – ChrisH

+2

Oye, convertí esto en un plist que también incluye las provincias canadienses. Un poco más limpio + puede agregar más (solo cargue el diccionario desde un archivo en lugar de escribirlo en el código). Este método es genial sin embargo. http://cl.ly/3c0W1s3E1J1Y – shim

3

Creo que la documentación es incorrecta. AdministrativeArea siempre devolverá el nombre completo del estado de los lugares en los Estados Unidos. Para obtener la abreviatura del estado, lo más probable es que tengas que crear una tabla de búsqueda del diccionario para que la búsqueda de la clave "California" te devuelva el valor "CA".

6

creo que usted no puede conseguir las abreviaturas de los estados, pero usted puede hacer su propia clase para este ..

  • una lista de todos los estados (estados son estándares)
  • comparar esos estados y vuelta la abreviatura

Código ..

Clase 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 

Cuando se llama a la clase que debe ser algo como esto

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

Esto son sólo muestras se puede investigar todos los estados algo como esto, states and their abbreviations también me gusta states and their abbreviations

+1

Gracias! Pero, ¿podría actualizar el código para mostrar cómo implementarlo con administrativeArea? ¿Simplemente lo puse en algo como objectForKey o algo así? Estoy un poco confundido sobre cómo hacer eso. ¡Gracias por la respuesta! – sridvijay

+0

marque el código de arriba – dianz

+0

Gracias por la actualización pero consigo 2 errores al hacer esto. 1. Variable de instancia 'strAbbreviation' a la que se accede en el método de clase. 2. La conversión implícita de NSUInteger a NSString * no está permitida en ARC. Saqué las declaraciones de lanzamiento para que funcionen en ARC, pero no sé cómo resolverlas. Gracias, gracias. Por ayudar, lo aprecio. – sridvijay

1

Aquí hay otra categoría utilizando FormattedAddressLines, devuelve un resultado como 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; 
} 

No es perfecto, pero funciona siempre que Apple cha nges el formato de las líneas de direcciones, creo.

1

Para personas que necesitan la lista del estado con los objetos y las claves intercambiados (por ejemplo en iOS 7 consigo "CA" de 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

A partir de al menos iOS 8, CLPlacemark 's administrativeArea devuelve una Abreviatura de dos letras para Estados Unidos.

No necesita extender CLPlacemark con una categoría como la que está en la respuesta aceptada, siempre y cuando esté orientada a iOS 8 y más reciente (que debería ser ahora).

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); 
}]; 

Ejecutar este y obtendrá:

State: CA 
+1

Esta no es una declaración verdadera al menos de acuerdo con los documentos más recientes que Apple tiene disponible: La cadena en esta propiedad puede ser el nombre del área administrativa o su abreviatura designada, si existe. Si la ubicación de la marca de posición es la sede de Apple, por ejemplo, el valor de esta propiedad sería la cadena "CA" o "California". –