MKMapView和导航控制器的问题

时间:2010-04-16 13:12:57

标签: iphone uinavigationcontroller mkmapview

我有一个UITableView(在导航控制器堆栈上),它显示了自定义模型对象的详细信息。该对象具有一个数组属性,用于保存子对象,每个子对象都具有纬度和经度属性。

由于我从网络服务API“延迟加载”所有内容,因此在用户首次点击详细信息视图中的单元格以查看地图上的对象之前,不会填充子对象数组。此时我首先创建并推送一个临时“加载视图”,它进行api调用,填充数组,然后创建并推送地图视图。

问题是,一旦将基于地图的视图推送到导航控制器上,它就不会显示MKMapView。导航栏标题和后退按钮更改正确,但我仍然可以看到应用程序选项卡栏和导航栏之间的上一个加载视图! 如果先前已经填充了数组,那么我会在详细视图之后直接推送基于地图的视图,并且它可以正常工作。我也在我的项目中使用这个地图视图控制器而没有以前的问题。

我不能为我的生活得到正在发生的事情。如果我更改'loading'视图控制器以模态方式显示地图视图,那么它也可以正常工作。地图视图控制器nib被2个自定义控制器类使用,我最初认为这是问题 - 但IB中的文件所有者现在设置为正确的控制器。

以下是加载视图中推送地图视图的代码:

ObjectMapViewController *objectMapVC = [[ObjectMapViewController alloc] 
                initWithNibName:@"ObjectLocationView" bundle:nil];

objectMapVC.objectsToMap = self.object.childObjects;

[self.navigationController pushViewController:objectMapVC animated:YES];

[objectMapVC release];

任何帮助都非常感谢!

3 个答案:

答案 0 :(得分:1)

此问题的最可能原因是您在后台线程中运行下载。如果在同一个线程中显示/配置MapView,那可能是个问题。所有UI操作都必须在主线程上运行。 这可以解释为什么performSelector afteDelay解决了这个问题。

答案 1 :(得分:0)

通过将上述代码包装在单独的方法中并使用

调用来解决此问题
[self performSelector:@selector(pushMapView) withObject:nil afterDelay:0.3];

API调用完成后。

我假设导航控制器没有足够的时间来正确设置其视图堆栈,因为API调用通常需要一秒钟才能完成,因此几乎在加载视图动画时就会推送地图视图英寸

答案 2 :(得分:0)

我相信我遇到了类似的问题。在与导航控制器和MKMapView争夺一天之后,我终于找到了解决方案。这是我的代码

CustomMapController*mapController=[[[CustomMapController alloc]init] autorelease];
mapController.delegate=self;
mapController.view.userInteractionEnabled=YES;
UINavigationController*navController=[[[UINavigationController alloc]initWithRootViewController:mapController] autorelease];

[(UIViewController*)[self.view.superview nextResponder] presentModalViewController:navController animated:YES];
[mapController loadGPSMapWithlongitude:longitudeString andLatitude:latitudeString];

在函数loadGPSMapWithlongitude中,通过调用

设置并重绘地图的区域
[mapView setRegion:region animated:YES]; and 
[mapView regionThatFits:region];

我遇到的问题是mapController里面的mapView永远不会被位置更新,即使我介入它以确保它已正确执行并且所有值确实正确地传递给mapview。

这是我的解决方案:

在CustomMapController的旁边,覆盖函数

 -(void)viewWillLayoutSubviews

并执行map updtae [mapView setRegion:self.region animated:YES];     [mapView regionThatFits:region];

所以在loadGPDMapWithLongitude :: function中,我只是将位置传递给self.region。出于一个非常奇怪的原因,UINavigationController + ModalView中的mapview必须遵循此代码序列。我从来没有遇到任何问题。