为什么在navigationController上覆盖:willShowViewController:标签栏必需的动画

时间:2012-11-09 14:37:05

标签: ios uinavigationcontroller uitabbarcontroller

我有一个从AppDelegate创建tabbarcontroller的应用程序。我想在导航栏中添加一个按钮,但无法使用。最终我设法获得了一些工作代码,但我真的不明白它。

步骤是:

  1. 确认AppDelegate为UINavigationControllerDelegate
  2. 设置rootNavigationController.delegate = self
  3. 覆盖navigationController:willShowViewController:animated和tabBarController:didSelectViewController
  4. 我想我遵循 tabBarController:didSelectViewController 代码,但在 navigationController:willShowViewController:animated 所发生的事情中迷失了。

    - (void) tabBarController: (UITabBarController*) tabBarController didSelectViewController: (UIViewController*) viewController
    {
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
        {
         self.tabBarController.navigationItem.title = viewController.navigationItem.title;
         self.tabBarController.navigationItem.rightBarButtonItems = viewController.navigationItem.rightBarButtonItems;
         self.tabBarController.navigationItem.leftBarButtonItems = viewController.navigationItem.leftBarButtonItems;
         }
      }
    
    
    
    - (void) navigationController: (UINavigationController*) navigationController
       willShowViewController: (UIViewController*) viewController
                     animated: (BOOL) animated
        {
          if (viewController == tabBarController)
          {
            UIViewController* tabViewController = tabBarController.selectedViewController;
        SEL willShowSel = @selector(navigationController:willShowViewController:animated:);
    
          if ([tabViewController respondsToSelector: willShowSel])
          {
            UIViewController<UINavigationControllerDelegate>* vc =
                (UIViewController<UINavigationControllerDelegate>*) tabViewController;
            [vc navigationController: navigationController willShowViewController: vc animated: animated];
          }
      }
    

1 个答案:

答案 0 :(得分:1)

此代码可能会处理UITabBarController内使用UINavigationController时出现的问题。 UITabBarController文档声明它必须是根视图控制器(即不在UINavigationController内)并以其他方式使用它可能会导致问题。

代码看起来正在做的是捕获通常传递给viewController的事件,检查它是否为UITabBarController,如果是,则检查{{1}中的可见视图响应此方法,如果确实如此,则将方法(选择器)调用传递给该视图。

如果有可能,我建议将UITabBarControllerUITabBarController嵌入。UINavigationController。可能需要一些工作,但会使您的代码符合要求。 (并删除对navigationController:willShowViewController:animated:

的需求