在每个选项卡错误处使用导航控制器从视图控制器转换到选项卡栏控制器

Posted

技术标签:

【中文标题】在每个选项卡错误处使用导航控制器从视图控制器转换到选项卡栏控制器【英文标题】:transition from viewcontroller to tab bar controller with a navigation controller at each tab error 【发布时间】:2013-01-10 14:00:13 【问题描述】:

您好,我添加了一个为 segue 准备的代码以传输信息,但是我遇到了一个错误。

我有一个标签栏控制器。它有 4 个选项卡。每个选项卡都有一个导航控制器,以及一个作为根视图控制器的 VC。

从 tab 1-->nav controller-->VC 1 我需要取一个值到 tab2-->nav controller --->VC1

(也是在选项卡 2 处连接到导航控制器的 segue,或在选项卡 2 处连接到根视图) 提前谢谢你

error:customizableViewControllers]:无法识别的选择器发送到实例 0xf19bd60 (但我要去标签 2(索引 1))? 我的错误在哪里?

    if ([segue.identifier isEqualToString:@"ResultsSegue"])

        
//the root VC at tab 2
            ResultsIndexViewController*controller=[[ResultsIndexViewController alloc]init];

            UITabBarController *tabController = [segue destinationViewController];
            controller = (ResultsIndexViewController*)[[tabController customizableViewControllers]objectAtIndex:1];//crashing here
            controller.resultsArray=[NSMutableArray arrayWithArray:_matchedResultsArray];

        
    

【问题讨论】:

另外,我需要代理吗? 您的错误基本上意味着,tabbarcontroller 不是UITabBarController。确定[segue destinationViewController] 返回UITabBarController?是这样的,segue是怎么配置的? segue 转到导航控制器,是否应该链接到标签栏控制器? 好的。 - 这解释了错误:您认为它是一个标签栏控制器,但它实际上是一个导航控制器。 customizableViewControllers是tabbarcontroller的方法;导航控制器不明白这一点。是否应该链接到标签栏控制器仅取决于您要实现的目标。导航控制器与选项卡控制器完全不同。任何;代码必须反映故事板中的内容。无论是导航还是标签栏。 所以我有一个tabcontroller(底部)。它有四个选项卡。每个选项卡都是通过具有根视图的 UINav 控制器创建的。导航控制器已连接(拖动)到标签栏控制器。 【参考方案1】:

这部分代码

 [1]   UITabBarController *tabController = [segue destinationViewController];
 [2]    controller = (ResultsIndexViewController*)[[tabController customizableViewControllers]objectAtIndex:1];//crashing here

充满了误解。

在 [1] 中,您将destinationViewController(类型UIViewController)分配给UITabBarController 类型的对象。这是编译器合法的(UITabBarController 继承自 UIViewController,因此它们都是 UIViewController 类型),但它并不能真正反映正在发生的事情。您的转场将是UIViewControllerUINavigationController

所以在第 [2] 行中,当您尝试使用您的 tabController 作为标签栏控制器时,它会崩溃(因为它不是一个)。

您需要重新设计您的项目...忘记 Segue,并使用标签栏控制器。比如……

- (IBAction)moveToTab2:(id)sender 
    ResultsViewController* resultsVC = (ResultsViewController*)
                [[self.tabBarController viewControllers] objectAtIndex:1];
    resultsVC.resultsArray=
                [NSMutableArray arrayWithArray:_matchedResultsArray];
    [self.tabBarController setSelectedViewController:resultsVC;

【讨论】:

一种方法是在您的应用委托中声明一个属性,从您的第一个 VC 中设置它并在您的第二个 VC 中获取它。这对你有用吗? (不是最好的,因为它散发着全局变量的味道,但它确实允许你解耦你的 vcs...) 我想,externs 可以工作(不是首选)我认为我需要使用@protocols,但我无法理解这一点 要使用委托,VC 之间必须有某种关系。 IE。一个必须是另一个的代表。除非您将 tabViewController 子类化并允许它成为两者的代表。或者让应用委托两者的委托。 抱歉没有考虑 MVC... 你应该创建一个模型对象。我会更新我的答案... 好的,代理只能在同一个视图导航控制器上使用?

以上是关于在每个选项卡错误处使用导航控制器从视图控制器转换到选项卡栏控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 Xcode Swift 项目的不同导航堆栈中从一个视图控制器屏幕切换到另一个?

如何从导航控制器切换到选项卡控制器并使其成为根视图控制器

iOS – 在导航堆栈中显示一个视图控制器

单击推送通知时,正确重定向到选项卡栏导航控制器内的视图控制器

单击隐藏选项卡视图控制器中的后退按钮时如何显示选项卡

如何识别从UITabBarController中的更多选项卡或单独选项卡单击视图控制器?