Это ошибка с MKMapKitDelegate mapView: didUpdateUserLocation? - PullRequest
6 голосов
/ 13 марта 2012

Я создал тестовое приложение только с одним представлением, содержащим MKMapView и контроллер, который действует как делегат MapView.

Когда я делаю новую сборку (полностью удаляется с устройства перед переустановкой)и регистрировать обратные вызовы, я вижу, что mapView:didUpdateUserLocation вызывается дважды, прежде чем пользователь указал, хотят ли они показать свое текущее местоположение или нет.

Объекты MKUserLocation, переданные обратному вызову, недействительны:

2012-03-13 08:20:17.518 MapTest[3325:707] Did update user location: 0.000000,0.000000
2012-03-13 08:20:17.581 MapTest[3325:707] Did update user location: 0.000000,0.000000

Это ожидаемое поведение для MKMapKit или ошибка?

Обновление

Я запускаю это на своем iPhone 4, а не на симуляторе.Вот код контроллера:

#import "ViewController.h"

@implementation ViewController

@synthesize mapView;

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.mapView.showsUserLocation = YES;
    self.mapView.delegate = self;
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

-(IBAction)trackButtonTapped:(id)sender
{
    self.mapView.showsUserLocation = !self.mapView.showsUserLocation;
}

#pragma mark - MKMapKitDelegate

-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    NSLog(@"Did update user location: %f,%f", userLocation.coordinate.latitude, userLocation.coordinate.longitude);
}

-(void)mapViewWillStartLoadingMap:(MKMapView *)mapView
{
    NSLog(@"Will start loading map");
}

-(void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
{
    NSLog(@"Did finish loading map");    
}

-(void)mapViewWillStartLocatingUser:(MKMapView *)mapView
{
    NSLog(@"Will start locating user");
}

-(void)mapViewDidStopLocatingUser:(MKMapView *)mapView
{
    NSLog(@"Did stop locating user");
}

-(void)mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error
{
    NSLog(@"Did fail loading map");
}

-(void)mapView:(MKMapView *)mapView didFailToLocateUserWithError:(NSError *)error
{
    if (error.code == kCLErrorDenied){
        NSLog(@"User refused location services");
    } else {
        NSLog(@"Did fail to locate user with error: %@", error.description);    
    }    
}

@end

Ответы [ 4 ]

10 голосов
/ 14 марта 2012

Мое мнение, что это ошибка.

Как в представлении карты может быть указано, что местоположение пользователя было обновлено, когда пользователь даже не дал разрешения?

Обходной путь, который я использую, заключается в проверке, является ли userLocation.location nil:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    if (userLocation.location == nil)
        return;

    //do something with userLocation...
}
5 голосов
/ 12 октября 2012

вместо проверки нуля userlocation (где 0,0 координаты могут быть действительными) вы должны использовать:

if([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorized) {
  // do something with the coords
} else {
  // the coords are invalid
}
0 голосов
/ 27 января 2015

Может быть, это кому-то поможет. Для меня «проблема» заключалась в том, что я выставил местоположение пользователя через конструктор интерфейсов. Удаление его здесь и установка его через код заставили методы делегата работать, как и предполагалось.

0 голосов
/ 13 марта 2012

С "self.mapView.showsUserLocation = YES;"в viewDidLoad он сразу начнет пытаться определить местоположение пользователя.Если вы уберете это, то подождите, пока пользователь не нажмет кнопку.

...