CLPlacemark - Сокращения штата?
Мне было интересно, можно ли получить сокращения от CLPlacemark?
В ссылке CLPlacemark от Apple говорится:
administrativeArea
Государство или провинция, связанная с меткой. (Только для чтения)
@property (nonatomic, readonly) NSString * AdministrativeArea
обсуждение
Например, если местом размещения метки является штаб-квартира Apple, значением для этого свойства будет строка "CA" или "California".
но всякий раз, когда я его использую, я получаю только полное состояние (например, в Калифорнии), а не аббревиатуру (например, CA). Может ли кто-нибудь помочь мне здесь?
Ответы
Ответ 1
Для кого-либо, у кого есть решение для этого, я создал класс категории для CLPlacemark, который возвращает короткую строку состояния. Все, что вам нужно сделать, это позвонить 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
Ответ 2
Я думаю, вы не можете получить сокращения штатов, но вы можете сделать свой собственный класс для этого.
- Список всех состояний (состояний являются стандартами)
- сравнить эти состояния и вернуть аббревиатуру
код..
Класс 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
Когда вы вызываете класс, это должно быть что-то вроде этого
NSString *upperCase = [@"California" uppercaseString]; // California could be from (NSString *)placemark.administrativeArea;
NSString *abbr = [StateAbbreviation allStates:upperCase];
NSLog(@"%@", abbr); // Result should be CA
Это только образцы, на которые вы можете исследовать все состояния, подобные этому, состояния и их сокращения также как и состояния и их сокращения
Ответ 3
Я считаю, что документация просто неверна. Административная служба всегда будет возвращать полное название штата для мест в Соединенных Штатах. Чтобы получить сокращение штата, вам, скорее всего, придется создать таблицу поиска словаря, чтобы поиск ключа "Калифорния" вернул вам значение "CA".
Ответ 4
Вот другая категория, использующая FormattedAddressLines, она возвращает результат, например, 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;
}
Не идеально, но он работает до тех пор, пока Apple меняет формат адресных строк, которые я думаю.
Ответ 5
Для людей, которым нужен список состояний с объектами и ключами, замененными (например, на iOS 7 я получаю "CA" от 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];
Ответ 6
По меньшей мере, iOS 8, CLPlacemark
administrativeArea
возвращает двухбуквенную аббревиатуру для американских государств.
Вам не нужно распространять CLPlacemark с категорией, подобной той, что была в принятом ответе, пока вы нацеливаете iOS 8 и новее (к чему вы должны быть к настоящему времени).
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);
}];
Запустите это, и вы получите:
State: CA