使用MKMapView的多个ViewControllers

时间:2013-12-23 00:29:27

标签: ios objective-c mkmapview

在我的应用中,我有UINavigationController

在某些页面中,我获得了MKMapView作为后视图(允许更改地图查看覆盖UIView UI,因此我无法将其设为图像)。 在某些组合中,可能有3个左右MKMapView已分配。

问题是每个MKMapView几乎 60MB ,因此内存只会从地图跳到 180+ MB 。更不用说用户是否打开了更多带有地图的ViewControllers,他将获得OutOfMemoryException

所有地图都有相同的内容,我尝试将地图从ViewController移动到另一个地图,但根据StackOverflow中的另一篇文章,将UIViewViewController移到另一个地方是针对MVC ,更不用说它将它从调用者ViewController中删除。

基本上,由于所有地图都包含相同的内容,而我希望它们包含所有注释,因此最好只移动地图,但我很难用它。

我有一个开箱即用的解决方案,即从其superView中删除MKMapView并在viewWillAppear重新分配它,但这似乎不是最好的主意。

1 个答案:

答案 0 :(得分:2)

当您从控制器移动到控制器时,我没有看到将指针传递到单个地图视图的任何问题。除非您一次查看多个地图,否则我不明白为什么应该有更多的实例。删除viewWillDisappear中的视图,并将指针传递给prepareForSegue:

中的地图
- (void)viewDidLoad {
    [super viewDidLoad];
    if (! self.mapView) {
        self.mapView = [[MKMapView alloc] initWithFrame:self.view.frame];
    }
}


-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.view addSubview:self.mapView];
    [self.view sendSubviewToBack:self.mapView];
}

-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self.mapView removeFromSuperview];
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    SecondViewController *secVC = segue.destinationViewController;
    secVC.mapView = self.mapView;
}

后续控制器可以在viewWillAppear,viewWillDisappear和prepareForSegue中使用相同的代码(目标控件是哪个控制器除外)。映射只需要在第一个控制器的viewDidLoad方法中实例化一次。更简单的实现是让所有后续视图控制器从第一个控制器继承。如果你这样做,你将不需要在viewWillAppear或viewWillDisappear中放置任何东西。您只需要覆盖prepareForSegue。