2012-01-09 79 views
1

我需要一些帮助,一个应用程序我使用MapKit的iOS MapKit轰然通过didUpdateUserLocation - 百思不得其解

我与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]; 
    } 
} 

的应用嗟“共同ORD失败”或“无效的REG”,所以我真的不知道是什么问题,因为我设置的值自己。

该问题通常发生在地图的笔尖已关闭并且已处理该视图时发生。

我看过其他一些建议,但对自己的工作还没有信心。理想情况下,我想用这样mapView.region.span保持缩放级别

非常感谢, 詹姆斯

+0

当它崩溃时,确切的错误信息是什么? – Anna 2012-01-09 03:43:58

+0

对不起,没有看到这一点在这里的菜鸟。 在调试时没有特定的错误代码,但在崩溃日志中崩溃的解释是[MapKit mapView:didUpdateUserLocation:]。我用Daryl的回答指导解决了这个问题。感谢您的回复! – jr19 2012-01-09 15:29:53

回答

-1

当地图笔尖被关闭,通常会出现的问题,它已经 dealloced风景。

[mapView setRegion:region animated:NO]; 

嘛是不是你的问题呢?

这就是为什么我们有像Observer/Listener这样的依赖倒置模式的原因。

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

+0

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation是委托调用的一部分,因此只能由MKMapView调用,所以我认为NSNotification并不是正确的选择。然而,你确实让我想到了(从你的正确观点来看,MapView已经发布了,我应该检查nob哈希已经发布了),并且我意识到我应该从dealloc发布MapView。这似乎提供了一个解决方案。感谢您的指导! – jr19 2012-01-09 11:47:33

1

当心,如果该悬浮一会儿,在重新开始一个应用程序的

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)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 

奇怪的是,0,0是从userLocation.location.coordinate产生而userLocation.location为零,导致有效协调,甚至!

事实上,对userLocation.location为零的检查似乎是最好的。

+0

感谢您的评论,这是由CLLocationCoordinate2DIsValid()检查覆盖 – jr19 2012-08-15 07:03:21

+0

我不认为CLLocationCoordinate2DIsValid捕获0,0(见上) – RickJansen 2012-08-15 17:11:01

+0

最好使用'if(userLocation.location == nil)'而不是检查0,0这在技术上是一个有效的坐标。 – Anna 2012-08-15 17:14:53