弹出视图控制器时,MKMapView会崩溃应用程序

Jih*_*ang 6 iphone objective-c mkmapview ios mkmapviewdelegate

我有一个带有调用的MKMapView的视图控制器

[self.mapView setRegion:region animated:YES]; 
Run Code Online (Sandbox Code Playgroud)

将地图从A重新定位到B.

保存MKMapView的视图控制器被设置为委托和in

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
Run Code Online (Sandbox Code Playgroud)

我有一些代码会触发另一个setRegion:animated:到MKMapView,以便地图自动放大新位置.

如果我popViewControllerAnimated,一切正常:视图控制器在MKMapView动画完成平移和缩放之后.

但是,当我尝试popViewControllerAnimated时:当前视图控制器在MKMapView运行它的动画时,应用程序崩溃,"消息发送到解除分配的实例".

从调试器的外观来看,我认为MKMapView正试图从弹出和释放的委托中调用一个方法.

所以我试过了

[self.mapView setDelegate:nil];
self.mapView = nil;
Run Code Online (Sandbox Code Playgroud)

在viewDidUnload中没有运气.该应用程序仍然一直崩溃.

我能想到的唯一的事情是创建一个单独的新的委托类和保留从父视图控制器类,以便将的MKMapView有一个代表包含它的视图控制器被释放后还要打电话.

为什么会这样?还有其他"干净"的选择吗?

Jih*_*ang 14

一位朋友帮我弄了这个.

我实现了自己的方法来弹出视图控制器,而不是使用默认的导航控制器的后退按钮.我只需要添加[self.mapView setDelegate:nil]; 在我弹出视图控制器之前.

- (void)goBack
{
    [self.mapView setDelegate:nil];
    [self.navigationController popViewControllerAnimated:YES];
}
Run Code Online (Sandbox Code Playgroud)

  • 在viewWillDisappear中无法做到这一点? (3认同)

Osc*_*car 8

好的,这才是真正的答案.它来自Apple文档,但它从MKMapView中丢失了.它仅在其委托协议的文档下找到:

"在发布已设置委托的MKMapView对象之前,请记住将该对象的委托属性设置为nil.您可以在dealloc方法中处理地图视图."

注意:这也适用于UIWebView.

我在委托的dealloc方法中将MapView的委托指针设置为nil,我们的崩溃似乎已被删除.