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

问题描述 投票:6回答:5

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

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

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

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

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

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

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

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

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

所以我试过了

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

在viewDidUnload中没有运气。该应用程序仍然始终崩溃。

我唯一能想到的是创建一个单独的新委托类并从父视图控制器中保留该类,以便即使在包含它的视图控制器被释放后,MKMapView也会有一个委托来调用。

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

iphone objective-c ios mkmapview mkmapviewdelegate
5个回答
14
投票

一位朋友帮我弄了这个。

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

- (void)goBack
{
    [self.mapView setDelegate:nil];
    [self.navigationController popViewControllerAnimated:YES];
}

8
投票

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

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

注意:这也适用于UIWebView。

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


0
投票

我的问题没有通过在我的视图Controller中将MKMapView的委托设置为nil来解决

[self.mapView setDelegate:nil];

我必须在我的RootViewController中创建一个包含MKMapView的UIViewController的__strong引用。

__strong <#UIViewController#> * vcNewLocation;


0
投票

我已经完成了Clustering并且正在标记选择,就像mapView.selectAnnotation(annotation, animated: true)一样。

弹出时,deinit方法曾经崩溃。

因此,按下后退按钮我只需添加此行mapView.deselectAnnotation(selectedAnnotation, animated: false),它就解决了崩溃问题。


-1
投票

以下代码可能会解决您的问题:

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

}
© www.soinside.com 2019 - 2024. All rights reserved.