reverseGeocodeLocation 存储为 NSString 产生错误

Posted

技术标签:

【中文标题】reverseGeocodeLocation 存储为 NSString 产生错误【英文标题】:reverseGeocodeLocation Stored as NSString Producing Error 【发布时间】:2012-12-17 07:50:10 【问题描述】:

我正在尝试使用 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;

有人知道如何解决这个问题吗?谢谢!

【问题讨论】:

你的函数添加到标题了吗? 我的 appDelegate 标头中有这个:-(NSString *) getAddressFromLocation; 我不知道我是否需要放置 :(CLLocation *)location 部分 【参考方案1】:

CLGeocoder 方法reverseGeocodeLocation:completionHandler: 异步运行。这意味着您不能从getAddressFromLocation: 返回地址,因为从该方法返回时根本没有设置地址。

当地理编码器收到地址(或调用导致错误)时,它将运行完成处理程序。您必须在完成处理程序中设置或显示地址。

最简单的方法是发送 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 ];
         
     ];

【讨论】:

谢谢!我可以将它存储在 NSuserdefaults 中吗? NSString *valueToSave = 地址; [[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@"address"]; 当然,一旦你拥有它,你就可以对地址做任何你想做的事情。你只需要找到一种方法告诉你的应用程序的其余部分你收到了地址。请记住,您不知道找到地址需要多长时间。它可能在几毫秒内,也可能需要半分钟。 哦,好的。我是否需要告诉 appDelegate 一些东西才能运行这段代码?还是会自动运行? 如果你想使用通知模式,你必须在你的 AppDelegate 中注册通知。请阅读Notification Programming Topics

以上是关于reverseGeocodeLocation 存储为 NSString 产生错误的主要内容,如果未能解决你的问题,请参考以下文章

从 reverseGeocodeLocation 获取位置名称

从 reverseGeocodeLocation 仅返回英文地址

使用 reverseGeocodeLocation 将用户的状态作为 NSString 返回

如何本地化来自 reverseGeocodeLocation 的地址结果?

同步请求 CLGeocoder.reverseGeocodeLocation

在 iOS 中强制使用 reverseGeocodeLocation 的语言环境