2012-01-09 41 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