1

Placemark を取得しているこのコードを使用していますが、都市名は表示されません。以前は MKReverse Geocoder を使用して都市名を取得している目印を取得していましたが、Apple 開発者が CLLocation にすべてを追加したため、iOS 6 のように非推奨になっています。

だから私はこのコードを使用しました:

-(void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{

    CLLocation *location = [locationManager location];
    NSLog(@"location is %@",location);

    CLGeocoder *fgeo = [[[CLGeocoder alloc] init] autorelease];

    // Reverse Geocode a CLLocation to a CLPlacemark
    [fgeo reverseGeocodeLocation:location
          completionHandler:^(NSArray *placemarks, NSError *error){

               // Make sure the geocoder did not produce an error
               // before continuing
               if(!error){
                    // Iterate through all of the placemarks returned
                    // and output them to the console
                    for(CLPlacemark *placemark in placemarks){
                           NSLog(@"%@",[placemark description]);
                           city1= [placemark.addressDictionary objectForKey:(NSString*) kABPersonAddressCityKey];
                           NSLog(@"city is %@",city1);
                    }
               }
               else{
                    // Our geocoder had an error, output a message
                    // to the console
                    NSLog(@"There was a reverse geocoding error\n%@",
                                         [error localizedDescription]);
               }
         }
    ];

}

ここでコンソールで見て NSLog(@"%@",[placemark description]); いるように、次のような出力が得られます:- abc道路名、abc道路名、州名、国名。

4

2 に答える 2

4

私が見ることができる3つのことは、注意を払うことができます...

まず、このメソッドは非推奨です (こちらのドキュメントを参照してください)。

(void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

代わりにこれを使用してみてください:

(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

あなたの最新の場所は、配列の最後の項目ですlocations

 /* 
 According to the Apple docs, the array of locations keeps the most recent location as the
 last object in the array 
 */
CLLocation *location = [locations lastObject];
NSLog(@"%@", location);

次に、ARC を使用している場合、自動解放メッセージは不要です。問題なくCLGeocoder *fgeo = [[CLGeocoder alloc] init];動作します。

最後に、CLPlacemark の Apple ドキュメントによるとlocality、目印の都市を返すプロパティがあります。そう

for(CLPlacemark *placemark in placemarks){
    NSLog(@"%@",[placemark description]);
    NSString *city1 = [placemark locality];
    NSLog(@"city is %@",city1); }

街が欲しいだけなら、このaddressDictionary物件はやり過ぎのようです。ドキュメント hereによると、addressDictionary は ABPerson オブジェクトで内容を返すようにフォーマットされています。これは、都市を取得するために解析する必要があると思います。目印の局所性ははるかに単純に見えます...

作成中のジオコーディング アプリで提案をテストしたところ、お探しの結果が得られました[placemark locality]

于 2012-11-05T20:05:00.213 に答える
4

アドレスを NSLog したい場合は、次のようにして構成する必要があります。

NSString *street = [[placemark addressDictionary] objectForKey:(NSString *)kABPersonAddressStreetKey];
NSString *city = [[placemark addressDictionary] objectForKey:(NSString *)kABPersonAddressCityKey];
NSString *state = [[placemark addressDictionary] objectForKey:(NSString *)kABPersonAddressStateKey];
NSString *country = [[placemark addressDictionary] objectForKey:(NSString *)kABPersonAddressCountryKey];
NSString *zip = [[placemark addressDictionary] objectForKey:(NSString *)kABPersonAddressZIPKey];

NSString *message = [NSString stringWithFormat:@"Address Is: %@, %@ %@, %@, %@", street, zip, city, state, country];

NSLog(@"%@", message);

または、次のように返された配列を反復処理できます。

NSArray *array = [[placemark addressDictionary] objectForKey:@"FormattedAddressLines"];

単に辞書の内容を印刷したい場合は、次のようにします。

NSLog(@"%@", [[placemark addressDictionary] description]);
于 2012-11-05T17:04:16.437 に答える