这是MKMapKitDelegate mapView:didUpdateUserLocation的错误吗?

我创建了一个测试应用程序,只有一个包含MKMapView的视图和一个充当MapView委托的控制器。

当我进行全新构建(在重新安装之前完全从设备中删除)并记录回调时,我可以看到mapView:didUpdateUserLocation在用户指示是否希望显示其当前位置之前被调用两次。

传递给回调的MKUserLocation对象无效:

 2012-03-13 08:20:17.518 MapTest[3325:707] Did update user location: 0.000000,0.000000 2012-03-13 08:20:17.581 MapTest[3325:707] Did update user location: 0.000000,0.000000 

这是MKMapKit或bug的预期行为吗?

更新

我在我的iPhone 4上运行它,而不是模拟器。 这是控制器代码:

 #import "ViewController.h" @implementation ViewController @synthesize mapView; - (void)viewDidLoad { [super viewDidLoad]; self.mapView.showsUserLocation = YES; self.mapView.delegate = self; } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. } -(IBAction)trackButtonTapped:(id)sender { self.mapView.showsUserLocation = !self.mapView.showsUserLocation; } #pragma mark - MKMapKitDelegate -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { NSLog(@"Did update user location: %f,%f", userLocation.coordinate.latitude, userLocation.coordinate.longitude); } -(void)mapViewWillStartLoadingMap:(MKMapView *)mapView { NSLog(@"Will start loading map"); } -(void)mapViewDidFinishLoadingMap:(MKMapView *)mapView { NSLog(@"Did finish loading map"); } -(void)mapViewWillStartLocatingUser:(MKMapView *)mapView { NSLog(@"Will start locating user"); } -(void)mapViewDidStopLocatingUser:(MKMapView *)mapView { NSLog(@"Did stop locating user"); } -(void)mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error { NSLog(@"Did fail loading map"); } -(void)mapView:(MKMapView *)mapView didFailToLocateUserWithError:(NSError *)error { if (error.code == kCLErrorDenied){ NSLog(@"User refused location services"); } else { NSLog(@"Did fail to locate user with error: %@", error.description); } } @end 

我的观点是,这是一个错误。

当用户甚至没有授予权限时,地图视图如何说用户位置已更新?

我使用的解决方法是检查userLocation.location是否为nil

 - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { if (userLocation.location == nil) return; //do something with userLocation... } 

而是检查nil userlocation(其中0,0坐标实际上可以有效),你应该使用:

 if([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorized) { // do something with the coords } else { // the coords are invalid } 

使用“self.mapView.showsUserLocation = YES;” 在viewDidLoad中,它将开始尝试立即获取用户的位置。 如果你拿出它,它会等到用户按下按钮。

也许这有助于某人。 对我来说,“问题”是我通过界面构建​​器设置了show user的位置。 在此处删除它并通过代码进行设置使得委托方法可以正常工作。

Interesting Posts