iOS MapKit аварийно завершает работу через didUpdateUserLocation - сбит с толку - PullRequest
1 голос
/ 09 января 2012

Мне нужна помощь с приложением, которое я создаю с помощью 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];
    }
} 

Приложение никогда не нажимает "сбой координаты" или "неверный регистр", поэтому я не знаю, в чем проблема, так как сам устанавливаю значения.

Проблема обычно возникает, когда перо для Карты закрыто, и оно ослабило представление.

Я видел некоторые другие предложения, но не был уверен в их работе. В идеале я хотел бы использовать mapView.region.span, чтобы поддерживать уровни масштабирования

Большое спасибо, Джеймс

Ответы [ 2 ]

1 голос
/ 15 августа 2012

Обратите внимание, что если приложение, которое было приостановлено на короткое время, при возобновлении работы делегат

- (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 равно nil,в результате чего получается правильная координата! Даже 101

0 голосов
/ 09 января 2012

Проблема обычно возникает, когда перо для карты закрыто и отменил представление.

   [mapView setRegion:region animated:NO];

Ну, разве это не твоя проблема?

Вот почему у нас есть шаблоны инверсии зависимостей, такие как Observer / Listener.

Вместо того, чтобы возиться с представлением непосредственно с вашим делегатом CLLocationManager, используйте NSNotification для оповещения подписывающих представлений (таких как ваш MapView), которые он должен обновить. Если MapView был освобожден, он ничего не будет делать.

...