iOS MapKit通过didUpdateUserLocation崩溃 - 令人困惑

时间:2012-01-09 03:10:53

标签: ios map mapkit region

我需要一些使用MapKit制作的应用程序的帮助

我正在努力使用didUpdateUserLocation: - 它会随机崩溃应用程序。当我将所有代码注释掉时,它可以完美地工作,但这不是一个合适的情况。我一直在摆弄它,但仍然没有取得真正的成功。

这是我的代码

-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
    NSLog(@"update loc");
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 250.0, 250.0);//MKCoordinateRegionMake(userLocation.coordinate, mapView.region.span);
    if (first) {
        region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 250.0, 250.0);
        first = false;
    }
    if (!CLLocationCoordinate2DIsValid(userLocation.coordinate)) {
        //do nothing, invalid regions
        NSLog(@"co-ord fail");
    } else if (region.span.latitudeDelta <= 0.0 || region.span.longitudeDelta <= 0.0) {
        NSLog(@"invalid reg");
    } else {
        [mapView setRegion:region animated:NO];
    }
} 

应用程序永远不会出现“co-ord fail”或“invalid reg”,因此我不知道问题是什么,因为我自己设置了这些值。

当Map的nib关闭并且已取消分配视图时,通常会出现此问题。

我已经看到了其他一些建议但对自己的工作没有信心。理想情况下,我想使用mapView.region.span来保持缩放级别

非常感谢, 詹姆斯

2 个答案:

答案 0 :(得分:1)

请注意,如果某个应用程序暂停了一段时间,请继续

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation 

委托收到第一个userLocation(0.0,0.0)作为纬度,经度!我认为这是一个错误..检查:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
NSLog( @"userLocation:(%p) %@",userLocation,userLocation);
NSLog( @"userLocation.location:(%p) %@",userLocation.location,userLocation.location);
NSLog( @"userLocation.coordinate: %f,%f valid:%d",userLocation.coordinate.latitude,userLocation.coordinate.longitude,  CLLocationCoordinate2DIsValid(userLocation.coordinate));
NSLog( @"userLocation.location.coordinate: %f,%f valid: %d",userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude, CLLocationCoordinate2DIsValid(userLocation.location.coordinate));

结果:

userLocation:(0x193fc0) <MKUserLocation: 0x193fc0>
userLocation.location:(0x0) (null)
userLocation.coordinate: -180.000000,-180.000000 valid:0
userLocation.location.coordinate: 0.000000,0.000000 valid: 1

奇怪的是,当userLocation.location为nil时,userLocation.location.coordinate会产生0,0,甚至会产生有效的坐标!

确实,对userLocation.location的检查似乎是最好的。

答案 1 :(得分:-1)

  

问题通常发生在地图的笔尖关闭时   已经解除了观点。

   [mapView setRegion:region animated:NO];
那不是你的问题吗?

这就是为什么我们有依赖倒置模式,如Observer / Listener。

不要直接使用CLLocationManager委托来摆弄视图,而是使用NSNotification来提醒它应该更新的订阅视图(例如MapView)。如果MapView已被释放,它将不会执行任何操作。