2012-01-09 6 views
1

を困惑私はMapKitのiOS MapKit -

を使用して作ってるんだアプリでいくつかの助けを必要と私はdidUpdateUserLocationに苦しんだ: - それは、ランダムにアプリをクラッシュし。すべてのコードをコメントアウトすると完全に動作しますが、これは適切な状況ではありません。私はそれをすべて手伝ってきましたが、まだ本当の成功はありません。

はここに私のコードアプリは「失敗共同ORD」または「無効REG」ヒット決して

-(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]; 
    } 
} 

だので、私は本当に私が値自身を設定するので、問題が何であるかを知りません。

通常、この問題は、マップのペン先が閉じられ、ビューが割り当て解除されている場合に発生します。

私は他のいくつかの提案を見ましたが、自分の仕事について自信を持っていません。理想的には私は

多くのおかげで、 ジェームズをズームレベルを維持するので、mapView.region.spanを使用したい

+0

クラッシュ時の正確なエラーメッセージは何ですか? – Anna

+0

申し訳ありませんが、これは見たことがありませんでした。 デバッグ時にクラッシュログに特定のエラーコードがありませんでした。クラッシュの説明は[MapKit mapView:didUpdateUserLocation:]になります。ダリルの答えの指針を使って問題を解決しました。お返事をありがとうございます! – jr19

答えて

-1

地図のためのペン先が閉じているときに問題が発生し、通常は、それ がdeallocedました景色。

[mapView setRegion:region animated:NO]; 

まあ、あなたの問題ということではないでしょうか?

これは、Observer/Listenerのような依存性反転パターンがある理由です。

CLLocationManagerデリゲートでビューを直接操作するのではなく、NSNotificationを使用して更新する必要がある(MapViewなどの)購読するビューに警告します。 MapViewが割り当て解除された場合、何も行われません。

+0

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocationはデリゲートコールの一部であるため、MKMapViewによってのみ呼び出されるため、NSNotificationは適切な方法ではないと思います。しかし、MapViewがリリースされ、nobogがリリースされたことを確認してください)、私はdeallocからMapViewをリリースしなければならないことを認識しました。それは解決策を提供したようです。あなたの指導に感謝します! – jr19

1

しばらく中断したアプリケーションの場合、履歴書に

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

デリゲートは、緯度、経度、第1 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である一方、0,0 userLocation.location.coordinateから生産されていることをコーディネート、さらに!

実際、userLocation.locationがnilであることが最もよく確認されます。

+0

あなたのコメントのおかげで、これはCLLocationCoordinate2DIsValid()チェックの対象となります – jr19

+0

CLLocationCoordinate2DIsValidが0,0をキャッチするとは思わない(上記参照) – RickJansen

+0

'if(userLocation.location == nil)'を使用する方が良い0,0は技術的に有効な座標です。 – Anna

関連する問題