2012-06-19 8 views
18

CLPlacemarkから状態の略語を取得することが可能かどうか疑問に思っていましたか?アップルからCLPlacemark参考にCLPlacemark - 状態の略語?

それは述べて:

administrativeArea 目印に関連付けられている都道府県を。 (読み取り専用) @property(nonatomic、readonly)NSString * administrativeArea ディスカッション たとえば、目印の場所がAppleの本社の場合、このプロパティの値は文字列 "CA"または "California"になります。

ですが、私が使用するたびに、私はフル状態(カリフォルニア)と省略形(CA)を取得しません。誰も私をここで助けることができますか?

+1

は[CLPlacemark-StateAbbreviation](https://github.com/jweyrich/CLPlacemark-StateAbbreviation)、まさにその作業を行います。 – jweyrich

答えて

32

解決策が必要な他の人には、短い状態の文字列を返す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 
+1

ありがとう!私はこれが将来の用途/これを見ている訪問者のために本当に役に立つと思う! – sridvijay

+1

元の質問の後にこれを長く受け入れてくれてありがとう...うまくいけば、それは誰かにとって有用である。 – ChrisH

+2

ねえ、私はこれもカナダの州を含むplistに変えました。ビットクリーナー+あなたはそれを追加することができます(コードで書くのではなく、ファイルから辞書をロードするだけです)。しかし、この方法は素晴らしいです。 http://cl.ly/3c0W1s3E1J1Y – shim

3

私はドキュメントが間違っていると思います。 administrativeAreaは、常に米国内の場所の完全な州名を返します。状態の省略形を取得するには、キー "California"を検索すると "CA"という値を返すように辞書ルックアップテーブルを作成する必要があります。

6

私はあなたの状態の略語を得ることができないと思いますが、あなたは、このために独自のクラスを作ることができます。..すべての状態(状態が標準です)

  • は、それらの状態とリターンを比較

    • 一覧略語

    コード..

    クラス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 
    

    のようなものでなければなりませんstates and their abbreviationsこのようなものstates and their abbreviations

  • +1

    ありがとう!しかし、これを実装する方法を示すコードを、administrativeAreaで更新することはできますか?私はちょうどobjectForKeyか何かのようなものに入れますか?私はそれをどうやって行うのかちょっと混乱しています。答えをありがとう! – sridvijay

    +0

    上記コードを確認してください – dianz

    +0

    更新をありがとうございますが、これを行う際に2つのエラーが発生します。 1.クラスメソッドでアクセスされるインスタンス変数 'strAbbreviation'。 2. NSUIntegerをNSString *に暗黙的に変換することは、ARCでは禁止されています。私はARCで動作させるためにリリース文を取り出しましたが、私はこれらを解決する方法を知らない2.アガイありがとう。助けを求めて、私はそれを感謝します。 – sridvijay

    1

    が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; 
    } 
    

    完璧ではありませんが、Apple cha私は思うアドレスラインのフォーマットをnges。少なくともiOSの8、CLPlacemark年代返し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

    (例えばiOSの7の上に、私はplacemark.administrativeAreaから「CA」を取得する)スワップUS州の2文字の略語。

    あなたがiOS 8以降をターゲットにしている限り、受け入れられた回答のカテゴリのようなカテゴリでCLPlacemarkを拡張する必要はありません。

    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 
    
    1

    :オブジェクトとキーを持つ状態リストを必要とする人々のために

    +1

    これは少なくともAppleが利用可能な最新の文書によれば、真実ではありません。 このプロパティの文字列は、管理領域のスペルアウト名または指定された省略形(存在する場合)になります。目印の場所がAppleの本社の場合、たとえば、このプロパティの値は文字列 "CA"または "California"になります。 –