我正在构建一个小型应用程序,该应用程序可以从Web服务器读取一些数据,并且可以使用finde。然后我做了一个方法,它是一个空白,只从一些地址获得纬度和经度。
-(void)getLocation{
if (!self.geocoder) {
self.geocoder = [[CLGeocoder alloc] init];
}
NSString *address = self.label1.text;
[self.geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) {
if ([placemarks count] > 0) {
CLPlacemark *placemark = [placemarks objectAtIndex:0];
CLLocation *location = placemark.location;
CLLocationCoordinate2D coordinate = location.coordinate;
latitude1 = coordinate.latitude;
longitude1 = coordinate.longitude;
}
}];
}
在.h文件中,我已经向变量(而不是在接口中)声明了这些:
@property double latitude1;
@property double longitude1;
然后我用一个按钮来称呼它:
- (IBAction)find:(id)sender{
NSLog(@"Latitude1: %f og Longitude1: %f", latitude1, longitude1);
float spanX = 0.00725;
float spanY = 0.00725;
MKCoordinateRegion region;
region.center.latitude = self.latitude1;
region.center.longitude = self.longitude1;
region.span = MKCoordinateSpanMake(spanX, spanY);
[self.mapView setRegion:region animated:YES];
}
这非常好。。。。
但我不能称之为
NSLog(@"Latitude: %f and %f",latitude1, longitude1 );
来自viewDidLoad方法。
这就像我必须在IBaction中使用它,而且我不能以任何其他方式使用latitude1和longitude1。我需要的是获取纬度和经度,并能够按照我想要的方式使用这些值,而不仅仅是按下按钮。
如果我手动按下更新按钮,它就会在地图上显示内容并显示纬度和经度,但当我在viewdidload方法中使用它时,它只显示0.00000,这是没有意义的。
我一直在思考的另一件事是如何从一个方法返回多个值,就像我想从getLocation方法返回latitude1和longitude1一样。nsdictionary或数组或结构?
您的示例代码并不完整,但以下是我的建议。
在此代码链接上设置断点:
if ([placemarks count] > 0) {
如果GEOCODER块失败,则位置将为0。
我的猜测是,在您的viewDidLoad中,您还没有成功地对位置进行地理编码。geocodeAddressString
方法是异步的。你叫它,它会立即返回。然后,在将来的某个时间,您的完成块会被调用。
它必须等待,因为地理编码过程通过您的网络连接连接到远程服务器。
如果视图控制器的viewDidLoad方法在地理代码调用完成之前被调用,那么纬度和经度变量还不会被设置。
我建议您添加一个布尔实例变量"geocodingComplete"。在完成处理程序中将其设置为TRUE。然后你就可以判断你是否有一个有效的地理编码地址。