当推入导航堆栈时隐藏TabBar并在弹出导航堆栈时将其恢复

时间:2011-02-13 04:04:59

标签: ios4 uitabbarcontroller uitabbar

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

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

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

我试过hidesbottombarwhenpushed并且它隐藏了父标签栏控制器标签栏但是当我点击它时它不会带回来。

6 个答案:

答案 0 :(得分:38)

好的,最后我得到了答案,这就是我想要做的。

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

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

感谢eddy和他的帖子here

答案 1 :(得分: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;

}

希望它有所帮助。

答案 2 :(得分:1)

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

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

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

  1. 开始动画块。
  2. 在容器视图上设置转场。
  3. 从容器视图中删除子视图。
  4. 将新子视图添加到容器视图中。
  5. 提交动画块。
  6. 在这种情况下,容器视图将是应用程序的窗口。

答案 3 :(得分:1)

您还可以在选择tabBar控制器

时使用属性检查器隐藏它

enter image description here

答案 4 :(得分: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
            }
        }
    }

答案 5 :(得分:0)

在要推送的控制器中设置hidesBottomBarWhenPushed = true

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

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    segue.destination.hidesBottomBarWhenPushed = true
}