MKMapView аварийно завершает работу приложения, когда контроллер контроллера отображается - PullRequest
6 голосов
/ 01 сентября 2011

У меня есть контроллер представления с MKMapView, который вызывает

[self.mapView setRegion:region animated:YES]; 

, которая перемещает карту из А в Б.

Контроллер представления, который содержит MKMapView, установлен как делегат и в

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated

У меня есть некоторый код, который вызовет другой setRegion: animated: к MKMapView, так что карта автоматически увеличит новую позицию.

Все работает нормально, если я popViewControllerAnimated: контроллер представления ПОСЛЕ анимации MKMapView выполняет панорамирование и масштабирование.

Однако, когда я пытаюсь использовать popViewControllerAnimated: текущий контроллер представления, пока MKMapView запускает свою анимацию, приложение вылетает с «сообщением, отправленным в освобожденный экземпляр».

Судя по внешнему виду отладчика, я думаю, что MKMapView пытается вызвать метод из удаленного и освобожденного делегата.

Итак, я попытался

[self.mapView setDelegate:nil];
self.mapView = nil;

в viewDidUnload без удачи. Приложение по-прежнему последовательно падает.

Единственное, о чем я мог думать, - это создать отдельный новый класс делегата и сохранить этот класс из родительского контроллера представления, чтобы у MKMapView был делегат для вызова, даже после того, как контроллер представления, который его содержит, освобожден. *

Почему это происходит? Есть ли другие "чистые" варианты?

Ответы [ 5 ]

14 голосов
/ 02 сентября 2011

Друг помог мне получить это.

Я реализовал свой собственный метод для вызова контроллера представления вместо использования кнопки возврата контроллера навигации по умолчанию. Мне просто нужно было добавить [self.mapView setDelegate: nil]; прежде чем я выскочил контроллер представления.

- (void)goBack
{
    [self.mapView setDelegate:nil];
    [self.navigationController popViewControllerAnimated:YES];
}
8 голосов
/ 21 ноября 2011

ОК, это реальный ответ.Это из документа Apple, но он отсутствует в MKMapView.Его можно найти только в документации к его протоколу делегата:

"Перед выпуском объекта MKMapView, для которого вы установили делегат, не забудьте установить свойство делегата этого объекта равным nil. В одном месте вы можете сделать это вМетод dealloc, в котором вы избавляетесь от вида карты. "

ПРИМЕЧАНИЕ. Это также относится к UIWebView.

Я установил указатель делегата MapView равным nil в методе dealloc делегата, и наши сбои кажутсябыли устранены.

0 голосов
/ 25 апреля 2019

Я сделал кластеризацию и помечал аннотацию, выбранную следующим образом: mapView.selectAnnotation(annotation, animated: true).

во время нажатия, метод deinit использовался для сбоя.

Итак, при нажатии кнопки возврата Iпросто добавьте эту строку mapView.deselectAnnotation(selectedAnnotation, animated: false), и это решило проблему.

0 голосов
/ 21 ноября 2015

Моя проблема не была решена путем установки делегата MKMapView равным nil на мой взгляд Контроллер

[self.mapView setDelegate: nil];

Мне пришлось сделатьсильная ссылка на мой UIViewController, содержащий MKMapView в моем RootViewController.

__ strong <# UIViewController #> * vcNewLocation;

0 голосов
/ 18 апреля 2013

Следующий код может решить вашу проблему:

-(void) viewWillDisappear:(BOOL)animated
{
    self.mapView.delegate = nil;
    mapView=Nil;
    NSLog(@"viewWillDisappear");

}
...