Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone CLPlacemark-州缩写?_Iphone_Ios_Clgeocoder - Fatal编程技术网

Iphone CLPlacemark-州缩写?

Iphone CLPlacemark-州缩写?,iphone,ios,clgeocoder,Iphone,Ios,Clgeocoder,我想知道是否有可能从CLPlacemark获得州缩写 在Apple的CLPlacemark参考中,它指出: 行政区 与地名有关的州或省。(只读) @属性(非原子,只读)NSString*管理区域 讨论 例如,如果placemark位置是Apple的总部,则此属性的值将是字符串“CA”或“California” 但每当我使用它,我只得到完整的州(即加利福尼亚州),而不是缩写(即CA)。有人能帮我吗?我认为文档不正确。行政区总是会返回美国各地的全名。要获取州缩写,您很可能需要创建一个字典查找表,以便

我想知道是否有可能从CLPlacemark获得州缩写

在Apple的CLPlacemark参考中,它指出:

行政区 与地名有关的州或省。(只读) @属性(非原子,只读)NSString*管理区域 讨论 例如,如果placemark位置是Apple的总部,则此属性的值将是字符串“CA”或“California”


但每当我使用它,我只得到完整的州(即加利福尼亚州),而不是缩写(即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"
]