mapView не масштабируется со второй попытки с использованием didUpdateUserLocation

я загружаю mapviewcontroller, когда кнопка просмотра карты нажата из моего mainviewcontroller:

- (IBAction)mapButton:(id)sender {
    MapKitDisplayViewController *mapKitDisplayView = [[MapKitDisplayViewController alloc] init];
    [self presentModalViewController:mapKitDisplayView animated:YES];   
    [mapKitDisplayView release]; mapKitDisplayView = nil;
}

При запуске этого вида карты вызывается этот метод, который правильно масштабирует местоположение пользователя:

- (void)mapView:(MKMapView *)myMapView didUpdateUserLocation:(MKUserLocation *)userLocation 
{ 
    myMapView.showsUserLocation = YES;
    NSLog(@"didUpdateUserLocation = '%@'", userLocation);

    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance([userLocation coordinate], 20000, 20000);
    [myMapView setRegion:region animated:YES];
}

У меня есть кнопка «Готово» на этом экране, которая закрывает это представление:

- (IBAction)mapDoneButton:(id)sender 
{    
    [self dismissModalViewControllerAnimated:YES];
}

На этом этапе пользователь возвращается к главному контроллеру представления, однако, когда я снова нажимаю кнопку просмотра карты, метод didUpdateUserLocation никогда не вызывается! Следовательно, вид карты уменьшен до стандартного и не будет увеличиваться, как раньше.

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

Благодарность


person GameDev    schedule 02.06.2011    source источник
comment
Куда помещаются все ваши showsUserLocation звонки? и какие значения они установлены?   -  person Deepak Danduprolu    schedule 02.06.2011
comment
извините, игнорируйте showUserLocation - это я просто тестировал материал. Это находит и приближает пользователя: MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance([координата userLocation], 20000, 20000); [myMapView setRegion:регион анимированный:YES]; На данный момент я просто использую местоположение пользователя по умолчанию, которое находит GPS. У меня также есть только симулятор для тестирования прямо сейчас.   -  person GameDev    schedule 02.06.2011


Ответы (2)


MKMapView сам по себе не запускает обновление местоположения пользователя. Вам нужно активировать поиск, установив showsUserLocation = YES. Затем это извлечет местоположение пользователя, а затем будет вызван метод делегата mapView:didUpdateUserLocation:. Поэтому установите это значение на YES на viewWillAppear:, и как только вы получите местоположение пользователя, вы можете установить его на NO, чтобы прекратить отслеживание пользователя. Если вы этого не сделаете, он будет периодически обновлять местоположение пользователя и вызывать метод делегата. Без этого местоположение пользователя должно быть ненадежным.

person Deepak Danduprolu    schedule 02.06.2011
comment
это все еще не сработало :( это потому, что я использую симулятор? Выполнение этого сделало то же самое! ViewWillAppear вызывается каждый раз, но mapView:didUpdateUserLocation: все еще не регистрируется со второй попытки создается uiviewcontroller. - person GameDev; 02.06.2011
comment
Просто чтобы было понятнее, я могу правильно определить местоположение пользователей, и синяя точка тоже отображается правильно, это даже работает нормально, когда я выхожу из карты и снова возвращаюсь. Просто масштабирование не работает во второй раз, когда я загружаю контроллер карты для просмотра карты! - person GameDev; 02.06.2011
comment
Я сделал тестовое приложение, которое вы можете download. Кажется, он работает нормально. - person Deepak Danduprolu; 02.06.2011
comment
Большое спасибо, Дипак, вау, ты невероятно быстр! Очень ценю вашу помощь. Угадайте, что получилось? С кодом все в порядке, но проблема была в построителе интерфейса на моем MKMAPVIEW, у меня был отмечен флажок showUserLocation!! :( Не могу поверить, сколько горя это причинило мне, но благодаря вашему тестовому приложению я смог его найти :D - person GameDev; 02.06.2011
comment
@GameDev Огромное спасибо, приятель! Вы спасли мой день. У меня была та же проблема. Она была решена, когда я снял флажок в свойстве showUserLocation в NIB. - person DroidHeaven; 18.05.2012
comment
@GameDev Я также нажал на поле showUserLocation и столкнулся с той же проблемой, что и у вас, спасибо! - person Senry; 28.06.2013

Что я делаю дальше:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
[[NSNotificationCenter defaultCenter] postNotificationName:@"gotUserLocation" object:self];}

то в viewDidLoad доступна проверка местоположения пользователя. если он не зарегистрирован в качестве получателя этого уведомления:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(zoomToLocation) name:@"gotUserLocation" object:nil];

если местоположение пользователя доступно, просто вызовите метод zoomToLocation

person kviksilver    schedule 02.06.2011
comment
привет, приятель, пробовал это также - но снова работает нормально при первой загрузке представления, но при второй загрузке, хотя эта строка выполняется: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(zoomToLocation) name:@gotUserLocation object:nil ]; Другие методы вообще не срабатывают: zoomToLocation или даже didUpdateUserLocation! - person GameDev; 02.06.2011