Iphone CLPlacemark-州缩写?
我想知道是否有可能从CLPlacemark获得州缩写 在Apple的CLPlacemark参考中,它指出: 行政区 与地名有关的州或省。(只读) @属性(非原子,只读)NSString*管理区域 讨论 例如,如果placemark位置是Apple的总部,则此属性的值将是字符串“CA”或“California”Iphone CLPlacemark-州缩写?,iphone,ios,clgeocoder,Iphone,Ios,Clgeocoder,我想知道是否有可能从CLPlacemark获得州缩写 在Apple的CLPlacemark参考中,它指出: 行政区 与地名有关的州或省。(只读) @属性(非原子,只读)NSString*管理区域 讨论 例如,如果placemark位置是Apple的总部,则此属性的值将是字符串“CA”或“California” 但每当我使用它,我只得到完整的州(即加利福尼亚州),而不是缩写(即CA)。有人能帮我吗?我认为文档不正确。行政区总是会返回美国各地的全名。要获取州缩写,您很可能需要创建一个字典查找表,以便
但每当我使用它,我只得到完整的州(即加利福尼亚州),而不是缩写(即CA)。有人能帮我吗?我认为文档不正确。行政区总是会返回美国各地的全名。要获取州缩写,您很可能需要创建一个字典查找表,以便搜索键“California”将返回值“CA”。我认为您无法获取州缩写,但您可以为此创建自己的类
- 列出所有州(州为标准)
- 比较这些状态并返回缩写
@interface StateAbbreviation : NSString {
}
+ (NSString *)allStates:(int)index;
+ (NSString *)abbreviatedState:(NSString *)strState;
@end
state缩写.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
这是唯一的示例您可以研究所有状态类似于这样的,也类似于这样的对于需要解决此问题的任何其他人,我为CLPlacemark创建了一个类别类,它返回短状态字符串。您只需调用
myplacemarkshortstate
CLPlacemark+ShortState.h
#import <CoreLocation/CoreLocation.h>
#import <Foundation/Foundation.h>
@interface CLPlacemark (ShortState)
- (NSString *)shortState;
@end
这里是另一个使用FormattedAddressLines的类别,它返回一个类似加利福尼亚州的结果
-(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上,我从placemark.administrativeArea获得“CA”):
至少从iOS 8开始,
CLPlacemark
的administrativeArea
返回美国各州的两个字母缩写
只要您的目标是iOS 8及更高版本(现在应该是这样),您就不需要使用类似于已接受答案中的类别来扩展CLPlacemark
运行此命令,您将获得:
State: CA
字典的快速变体
let states = [
"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"
]
谢谢但是,您能否更新代码以显示如何在administrativeArea中实现这一点?我是不是把它放在objectForKey之类的东西里?我对怎么做有点困惑。谢谢你的回答!谢谢你的更新,但我得到了2个错误,而这样做。1.在类方法中访问实例变量“StrabReviation”。2.ARC中不允许将NSUTEGER隐式转换为NSString*。我拿出发布声明让它在ARC中工作,但我不知道如何解决这两个问题。再次谢谢。谢谢你的帮助,我很感激。没问题,你能帮我解决这个问题吗:p?谢谢!我认为这对于将来看到这一点的用户/访客来说非常有用!谢谢你在最初的问题之后这么久才接受这个问题…希望是的,它确实对某人有用。嘿,我把它变成了一个plist,也包括加拿大的省份。稍微干净一点,你可以添加更多内容(只需从文件中加载字典,而不是用代码编写字典)。这个方法很好@很好。谢谢确实如此。至少根据苹果公司最近提供的文档来看,这不是一个正确的说法:该属性中的字符串可以是行政区域的拼写名称,也可以是其指定的缩写(如果存在)。例如,如果placemark位置是Apple的总部,则此属性的值将是字符串“CA”或“California”。
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
let states = [
"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"
]