我有一个带有三个标签的TabBarController。所有选项卡的视图都嵌入在他们自己的导航控制器中,除了一个地图视图。 要从其他视图导航到Map视图并传递我使用的数据:
- (IBAction)mapButton:(id)sender {
MapViewController *destView = (MapViewController *)[self.tabBarController.viewControllers objectAtIndex:0];
if ([destView isKindOfClass:[MapViewController class]])
{
MapViewController *destinationViewController = (MapViewController *)destView;
destinationViewController.selectedTruck = _truck;
}
[self.tabBarController setSelectedIndex:0];
}
它正在发挥作用。现在我还需要在导航控制器中嵌入Map视图,以添加详细视图,但是当我没有传递数据时,它只会进入Map视图。
任何人都可以看到我错过了什么吗?
答案 0 :(得分:1)
[self.tabBarController.viewControllers objectAtIndex:0]
不再是MapViewController
的实例。它是一个UINavigationController
,其根视图控制器为MapViewController
。
您可以通过MapViewController
访问UINavigationController
,但所有这些类型的投射假设都很混乱 -
- (IBAction)mapButton:(id)sender {
UINavigationController *navigationController = (UINavigationController *)[self.tabBarController.viewControllers firstObject];
if ([navigationController isKindOfClass:[UINavigationController class]])
{
MapViewController *rootViewController = (MapViewController *)[navigationController.viewControllers firstObject];
if ([rootViewController isKindOfClass:[MapViewController class]])
{
MapViewController *destinationViewController = (MapViewController *)rootViewController;
destinationViewController.selectedTruck = _truck;
}
}
[self.tabBarController setSelectedIndex:0];
}
相反,更好的设计是在设置标签栏时保留对MapViewController
(作为属性)的引用。这样您只需拨打self.destinationViewController.selectedTruck = _truck;
即可。