如何嵌套NavigationController-> TabBarController-> {NavigationController,NavigationController}

时间:2014-05-15 16:28:48

标签: ios objective-c

(iOS7中的问题) 我知道将TabBarController放在NavigationController中是不好的。但是,如果它确实需要,有什么解决方案吗? stroyboard就像" This"。

问题在于:

  1. 在项目TVC'中,backBarItem不会弹出到其父级' SampleTVC',而是为了root' ProjTVC',为什么?

  2. 在' SampleTVC'中,如果被呼叫:
    [self.navigationController setNavigationBarHidden:NO]
    [self.navigationController.navigationController setNavigationBarHidden:YES]
    以隐藏根导航栏并显示最近的祖先导航栏,如何将最近的祖先导航栏的leftBarButtonItem设置为root的navigationItem的backBarButtonItem?

  3. 如果两个导​​航栏都没有隐藏,根导航栏将占主导地位(显示在最近的祖先导航栏顶部。但是,如何将rightBarButtonItem添加到根导航栏?我试过:
    UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)]self.navigationItem setRightBarButtonItem:addButton,但未显示任何按钮。

  4. 设置self.navigationController.backBarButtionItem从未对其后续导航视图产生任何影响。总是零。

  5. 在我看来,在此配置中混合使用TabBarController和NavigationController时,self.navigationItem完成了混乱。

    (我使用的一个丑陋的解决方案是:首先隐藏根导航栏,然后将UIBarButtonItem分配给最近的祖先导航栏&leftBarButtonItem,然后调用[self.navigationController.navigationController popViewControllerAnimated:YES],但是这个按钮将是一个不同的样式,因为backBarButtionItem应该是。如何在另一个导航栏的项目中获取当前显示的backBarButtionItem的副本?)

2 个答案:

答案 0 :(得分:0)

从架构的角度和UX的角度来看,你真的不应该做这些事情。但是......你不需要第二套导航控制器。他们应该使用根导航控制器的推送和弹出就好了。导航控制器中的标签控制器很糟糕。但导航控制器内标签控制器内的导航控制器更糟糕。

编辑:

如果要修复导航项,则需要在选项卡控制器上进行设置。这是"当前"在导航控制器上查看控制器,因此它的导航项将显示在导航栏上。

答案 1 :(得分:0)

感谢您的提示。我已经删除了导航控制器。现在它可以正确地进行。 (问题1解决了)。

关于缺少RightBarButton,我实际上首先将self.navigationItem.rightBarButtonItem = addButton;添加到自定义tabBarController的viewDidLoad中,然后在tabBarController的子控制器中添加

if (self.tabBarController) {     
self.tabBarController.navigationItem.rightBarButtonItem = addButton;}
else{self.navigationItem.rightBarButtonItem = addButton;
}

发现self.navigationItem实际上隐藏在标签控制器中时,这真的很棘手。实际显示的navigationBar实际上来自self.tabBarController.navigationItem