1

reverseGeocodeLocationを使用してユーザーの状態を返そうとしています。このコードを使用して、ユーザーの場所を別のビューから取得しています。

NSString *userState =[(PDCAppDelegate *)[UIApplication sharedApplication].delegate     
getAddressFromLocation]; 

次のエラーが発生します:'NSInvalidArgumentException'、理由:'-[PDCAppDelegate getAddressFromLocation]:認識されないセレクターがインスタンスに送信されました。アドレスを返すためにPDCAppDelegateで使用しているコードは次のとおりです。

-(NSString *)getAddressFromLocation:(CLLocation *)location {
NSString *address;
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError 
*error)
 {
     if(placemarks && placemarks.count > 0)
     {
         CLPlacemark *placemark= [placemarks objectAtIndex:0];

         NSString *address = [NSString stringWithFormat:@"%@ %@,%@ %@", [placemark 
subThoroughfare],[placemark thoroughfare],[placemark locality], [placemark 
administrativeArea]];

         NSLog(@"%@",address);
     }

 }];

return address;
}

誰もがこれを修正する方法を知っていますか?ありがとうございました!

4

1 に答える 1

2

CLGeocoderメソッドreverseGeocodeLocation:completionHandler:は非同期で実行されます。つまりgetAddressFromLocation:、このメソッドから戻るときにアドレスが設定されていないため、からアドレスを返すことはできません。

ジオコーダーがアドレスを受信すると(または呼び出しによってエラーが発生すると)、completionHandlerが実行されます。完了ハンドラー内からアドレスを設定または表示する必要があります。

最も簡単なのはNSNotificationを送信することですが、おそらく最善の方法ではありません。

-(void)getAddressFromLocation:(CLLocation *)location {
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error)
     {
         if (!placemarks) {
             // handle error
         }

         if(placemarks && placemarks.count > 0)
         {
             CLPlacemark *placemark= [placemarks objectAtIndex:0];
             NSString *address = [NSString stringWithFormat:@"%@ %@,%@ %@", [placemark subThoroughfare],[placemark thoroughfare],[placemark locality], [placemark administrativeArea]];

             // you have the address.
             // do something with it.
             [[NSNotificationCenter defaultCenter] postNotificationName:@"MBDidReceiveAddressNotification" 
                  object:self 
                userInfo:@{ @"address" : address }];
         }
     }];
}
于 2012-12-17T08:04:28.270 に答える