我想知道是否有可能得到CLPlacemark状态的缩写?
在从苹果CLPlacemark参考它指出:
administrativeArea的州或省与地标有关。 (只读)@属性(非原子,只读)的NSString * administrativeArea讨论如果该地标位置是苹果公司的总部,例如,此属性的值是字符串“CA”或“加利福尼亚”。
但每当我使用它,我只得到充分的状态(即加利福尼亚),而不是缩写(即CA)。 有人能帮我一下吗?
我想知道是否有可能得到CLPlacemark状态的缩写?
在从苹果CLPlacemark参考它指出:
administrativeArea的州或省与地标有关。 (只读)@属性(非原子,只读)的NSString * administrativeArea讨论如果该地标位置是苹果公司的总部,例如,此属性的值是字符串“CA”或“加利福尼亚”。
但每当我使用它,我只得到充分的状态(即加利福尼亚),而不是缩写(即CA)。 有人能帮我一下吗?
对于其他人,需要一个解决方案,我创建了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
我想你不能得到国家的缩写,但你可以让自己的类的..
码..
类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
这仅仅是样品,你可以研究的各个国家是这样的, 状态和它们的缩写也是这样的状态和它们的缩写
我相信,文件仅仅是不正确。 该administrativeArea总是会在美国这样的地方返回完整的状态名称。 要获得国家缩写,你就极有可能创造一个字典查找表,以便在搜索关键字“加利福尼亚”将返回值“CA”。
下面是使用FormattedAddressLines另外一类,则返回加州一样,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;
}
并不完美,但只要苹果改变了地址线,我认为格式它的工作原理。
对于谁需要交换的对象和按键的状态列表(例如,在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];
至少针对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