将导航控制器添加到视图时无法传递数据

Posted

技术标签:

【中文标题】将导航控制器添加到视图时无法传递数据【英文标题】:Can not pass data when adding navigation controller to view 【发布时间】:2015-05-27 10:33:27 【问题描述】:

我有一个带有三个选项卡的 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 视图。

谁能看到我错过了什么?

【问题讨论】:

destView 可能为零?它会给你一个真实的 isKindOfClass 但这并不意味着它不是 nil ? 我无法理解您的问题。 可以上传storyboard的图片吗? 【参考方案1】:

[self.tabBarController.viewControllers objectAtIndex:0] 不再是MapViewController 的实例。它是一个UINavigationController,以MapViewController 作为其根视图控制器。

您可以像这样通过UINavigationController 访问MapViewController,但是所有这些类型转换假设都很混乱-

- (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;

【讨论】:

感谢您的回答。所以我会使用这样的东西? UINavigationController *destViewNVC = [[self storyboard] instantiateViewControllerWithIdentifier:@"MapNavVC"];但是然后呢?对不起,我对此有点陌生。

以上是关于将导航控制器添加到视图时无法传递数据的主要内容,如果未能解决你的问题,请参考以下文章

无法将自定义按钮添加到导航控制器的工具栏

如何将数据从视图控制器传递到标签栏控制器以及导航控制器?

使用导航栏按钮项和核心数据在视图控制器之间传递日期

bar button item segue 不在下一个视图顶部添加导航栏

如果我使用 prepareForSegue 传递数据,则无法嵌入导航控制器

如何将选项卡栏添加到默认视图并使用导航控制器与其他视图通信