【问题标题】:how to nest NavigationController->TabBarController-> {NavigationController, NavigationController}如何嵌套 NavigationController->TabBarController-> {NavigationController, NavigationController}
【发布时间】:2014-05-17 00:55:06
【问题描述】:

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

问题来了:

  1. 在“ItemTVC”中,backBarItem 不会弹出到其父级“SampleTVC”,而是弹出到根“ProjTVC”,为什么?

  2. 在'SampleTVC'中,如果调用:
    [self.navigationController setNavigationBarHidden:NO]

    [self.navigationController.navigationController setNavigationBarHidden:YES]
    隐藏根导航栏并显示最近的祖先导航栏,如何设置最接近祖先导航栏的leftBarButtonItem到根的navigationItem的backBarButtonItem?

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

  4. 设置self.navigationController.backBarButtionItem 永远不会对其后续导航视图产生任何影响。它始终为零。

在我看来,当 TabBarController 和 NavigationController 在此配置中混合时,self.navigationItem 会完全搞砸。

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

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    从架构的角度和用户体验的角度来看,您真的不应该这样做。但是...您不需要第二组导航控制器。他们应该很好地使用根导航控制器的推送和弹出。导航控制器中的选项卡控制器很糟糕。但是导航控制器中的导航控制器内部的导航控制器更糟糕。

    编辑:

    如果要修复导航项,则需要在 Tab Controller 上进行设置。它是导航控制器上的“当前”视图控制器,因此它的导航项将显示在导航栏上。

    【讨论】:

    • 感谢您的提示。我已经删除了 tabBarController 中的导航控制器。现在它可以正确地继续。 (问题1已解决)
    • @wanyancan 您需要在标签控制器上设置导航项。导航控制器从它们所持有的任何顶部视图控制器中选择导航项。
    • 我想你的意思是使用self.tabBarController.navigationItem,对吧?我知道了。在我看来,这违反直觉。 self.navigationItem 不应该是您在屏幕导航栏上看到的任何项目,无论 self 包含在什么中吗?
    • @wanyancan 当您没有如此糟糕的架构层次结构时。 p.s.接受答案吗?
    • 您的回答已被接受。但是,我确实认为在这种特殊情况下,导航项访问不应与“正常”层次结构有任何不同。
    【解决方案2】:

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

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

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

    self.navigationItem 在选项卡控制器中时,它实际上是隐藏的,这真的很棘手。真实展示的navigationBar其实来自self.tabBarController.navigationItem

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多