13

我正在尝试执行以下操作。

我有一个标签栏控制器,里面有 2 个标签。这两个选项卡都是导航控制器,每个选项卡上都有一个表格视图。

现在,当我在第一个选项卡中选择表格的一个单元格时,我正在推动另一个选项卡栏控制器,所以我想隐藏父选项卡控制器的选项卡栏,当我单击导航栏上的后退按钮时,我想再次查看父标签栏,就像我在父标签栏视图中一样。

我尝试了 hidesbottombarwhenpushed,它隐藏了父标签栏控制器标签栏,但是当我点击返回时,它不会将其返回。

4

6 回答 6

38

好的,所以最后我得到了答案,这就是我应该做的。

self.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:aViewController animated:YES];
self.hidesBottomBarWhenPushed=NO;

所以基本上 hidesBottomBarWhenPushed = YES,然后推送你的视图控制器,然后 hidesBottomBarWhenPushed = NO; 这就像一个魅力。

感谢eddy和他在这里的帖子

于 2011-02-14T04:27:05.387 回答
5

接受的答案对我来说有问题。

我的应用有一个深度为三个 UIViewController 的导航。

  • FirsViewController 显示的是 UITabBar。(正确的)
  • FirsViewController 推送 SecondViewController,SecondViewController 不显示 UITabBar。(正确的)
  • SecondViewController 推送了ThirdViewController,ThirdViewController 显示的是UITabBar。(不正确)
  • ThirdViewController 弹出到 SecondViewController,SecondViewController 显示的是 UITabBar。(不正确)
  • SecondViewController 弹出到 FirstViewController,FirstViewController 显示的是 UITabBar。(正确的)

我的解决方案是设置 UINavigationControllerDelegate 的委托

迅速:

self.navigationController?.delegate = self

目标-c:

self.navigationController.delegate = self;

然后实现下面的委托方法

迅速:

fun navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {

    if fromVC.isKindOfClass(FirstViewController) && toVC.isKindOfClass(SecondViewController) {

        self.hidesBottomBarWhenPushed = true;

    }
    else if fromVC.isKindOfClass(SecondViewController) && toVC.isKindOfClass(FirstViewController) {

        self.hidesBottomBarWhenPushed = false;

    }

    return nil

}

目标-c:

-(id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
                                 animationControllerForOperation:(UINavigationControllerOperation)operation
                                              fromViewController:(UIViewController*)fromVC
                                                toViewController:(UIViewController*)toVC
{

    if ([fromVC isKindOfClass:[FirstViewController class]] && [fromVC isKindOfClass:[SecondViewController class]]) {

        self.hidesBottomBarWhenPushed = true;

    }
    else if ([fromVC isKindOfClass:[SecondViewController class]] && [fromVC isKindOfClass:[FirstViewController class]]) {

        self.hidesBottomBarWhenPushed = false;

    }

    return nil;

}

希望它有所帮助。

于 2015-10-19T10:53:46.123 回答
1

您还可以在选择 tabBar 控制器时使用属性检查器将其隐藏

在此处输入图像描述

于 2013-06-18T22:00:42.370 回答
1

正如 Apple 文档所述,您不能在 NavigationController 上推送 UITabBarController 实例。这有一个很好的理由:如果您在标签栏中选择了另一个项目,您如何从推送的标签栏控制器返回?

简单的答案是:不要那样做,它会让你的用户感到困惑。您可以尝试将第一个视图控制器交换为另一个可能是选项卡栏控制器的视图控制器,但不要使用推送范例:使用显式按钮代替将您的第一个选项卡栏控制器交换为第二个,最好使用视觉过渡。

您可以查看该类的setAnimationTransition:forView:cache:文档以了解如何将标签栏控制器交换为另一个:UIView

  1. 开始一个动画块。
  2. 在容器视图上设置过渡。
  3. 从容器视图中移除子视图。
  4. 将新的子视图添加到容器视图。
  5. 提交动画块。

在这种情况下,容器视图将是应用程序的窗口。

于 2011-02-13T22:49:10.423 回答
0

在您的 FirstViewController 中使用

self.hidesBottomBarWhenPushed = true

在您的 SecondViewController 中使用

override func willMoveToParentViewController(parent: UIViewController?) {
  if parent == nil {
    var viewControllers = self.navigationController!.viewControllers
    if ((viewControllers[viewControllers.count - 2]).isKindOfClass(FirstViewController.self)) {
      (viewControllers[viewControllers.count - 2] as! FirstViewController).hidesBottomBarWhenPushed = false
    }
  }
}
于 2016-02-06T14:29:28.157 回答
0

设置hidesBottomBarWhenPushed = true在将被推送的控制器中。

隐藏所有控制器放入prepare for segue

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    segue.destination.hidesBottomBarWhenPushed = true
}
于 2019-08-13T19:01:13.163 回答