1

私はObjCを初めて使用し、CLGeocoderで苦労しています。reverseGeocodeLocationユーザーが[完了]ボタンを押したときに代理人に渡すユーザーの場所を含む文字列を取得するために使用できるようにしたいと思います。

したがって、ユーザーがMapViewControllerの表示をトリガーし、reverseGeocodeLocationを呼び出しますviewDidLoadが、[placemarks count = 0]これは初めてであり、必要な情報を取得するための目印がありません。2回目にユーザーがMapViewControllerの表示をトリガーすると、目印の配列が入力され、すべてが機能します。

これは、reverseGeocodeLocationが非同期呼び出しであることに関係していると思われますが、この問題を解決する方法がわかりません。オンラインで検索してみましたが、何が間違っているのか、この問題をどのように解決できるのかを理解するのに役立つものは何もありません。前もって感謝します。

@interface MapViewController ()
@property (strong, nonatomic) CLGeocoder *geocoder;
@property (readwrite, nonatomic) NSString *theLocationName;
@end

@implementation MapViewController
@synthesize mapView, geocoder, delegate = _delegate, theLocationName = _theLocationName;

- (void)viewDidLoad
{
[super viewDidLoad];

self.mapView.delegate=self;
self.mapView.showsUserLocation = YES;

[self theUserLocation];
}

-(void)theUserLocation
{
if (!geocoder)
{
    geocoder = [[CLGeocoder alloc] init];
}

MKUserLocation *theLocation;
theLocation = [self.mapView userLocation];

[geocoder reverseGeocodeLocation:theLocation.location 
               completionHandler:^(NSArray* placemarks, NSError* error)
 {
     if ([placemarks count] > 0)
     {
         CLPlacemark *placemark = [placemarks objectAtIndex:0];

         [self setTheLocationName: placemark.locality];

     }
 }];

- (IBAction)done:(id)sender 
{

[[self delegate] mapViewControllerDidFinish:self locationName:[self theLocationName]];

}

@end
4

2 に答える 2

3

これはあなたの質問に対する正確な答えではありませんが、CLGeocoder以外のソリューションに切り替えることができる場合は、次の関数を使用すると、指定された緯度、経度から住所を取得できます。

#define kGeoCodingString @"http://maps.google.com/maps/geo?q=%f,%f&output=csv" //define this at top

-(NSString *)getAddressFromLatLon:(double)pdblLatitude withLongitude:(double)pdblLongitude
{
    NSString *urlString = [NSString stringWithFormat:kGeoCodingString,pdblLatitude, pdblLongitude];
    NSError* error;
    NSString *locationString = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlString] encoding:NSASCIIStringEncoding error:&error];
    locationString = [locationString stringByReplacingOccurrencesOfString:@"\"" withString:@""];
    return [locationString substringFromIndex:6];
}

クレジット:この質問に対する選択された回答

于 2012-07-02T07:38:43.197 に答える
2

したがって、ユーザーがMapViewControllerの表示をトリガーし、viewDidLoadでreverseGeocodeLocationを呼び出しますが、今回は[placemarks count = 0]で、必要な情報を取得するための目印がありません。2回目にユーザーがMapViewControllerの表示をトリガーすると、目印の配列が入力され、すべてが機能します。

これは、呼び出しが非同期であるためではありません。最初に実際の場所を呼び出すときにtheUserLocation、実際の場所が利用できないためです。ユーザーの位置を取得するのは瞬時ではなく、時間がかかります。ただし、地図が読み込まれるとすぐにユーザーの場所を尋ねているため、ほとんどの場合は機能しません。

あなたがする必要があるMKMapViewDelegateのは、場所が更新されたときにコールバックを提供するメソッドにフックすることです。これを使用して、場所の精度を確認し、ジオロケートを逆にするのに十分な精度であるかどうかを判断できます。

于 2012-07-02T08:00:24.147 に答える