1

我是 ObjC 的新手,我正在努力使用 CLGeocoder。我希望能够用于reverseGeocodeLocation获取一个字符串,该字符串包含当用户按下完成按钮时我传递给我的委托的用户位置。

所以用户触发了 MapViewController 的显示,我在第一次调用 reverseGeocodeLocationviewDidLoad[placemarks count = 0],我没有地标来获取我需要的信息。用户第二次触发 MapViewController 的显示时,placemarks 数组已被填充并且一切正常。

我怀疑这与 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],并且我没有地标来获取我需要的信息。用户第二次触发 MapViewController 的显示时,placemarks 数组已被填充并且一切正常。

这不是因为调用是异步的 - 这是因为您第一次调用theUserLocation实际位置不可用。获取用户的位置不是即时的——它需要时间。但是,您会在地图加载后立即询问用户的位置,这在大多数情况下是行不通的。

您需要做的是挂钩MKMapViewDelegate方法,这些方法会在位置更新时为您提供回调。您可以使用它来检查位置的准确性,并确定它是否足够准确,以便您进行反向地理定位。

于 2012-07-02T08:00:24.147 回答