添加导航控制器进行查看时无法传递数据

时间:2015-05-27 10:33:28

标签: ios objective-c uinavigationcontroller uitabbarcontroller segue

我有一个带有三个标签的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视图。

任何人都可以看到我错过了什么吗?

1 个答案:

答案 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;即可。