我正在尝试执行以下操作。
我有一个标签栏控制器,里面有 2 个标签。这两个选项卡都是导航控制器,每个选项卡上都有一个表格视图。
现在,当我在第一个选项卡中选择表格的一个单元格时,我正在推动另一个选项卡栏控制器,所以我想隐藏父选项卡控制器的选项卡栏,当我单击导航栏上的后退按钮时,我想再次查看父标签栏,就像我在父标签栏视图中一样。
我尝试了 hidesbottombarwhenpushed,它隐藏了父标签栏控制器标签栏,但是当我点击返回时,它不会将其返回。
我正在尝试执行以下操作。
我有一个标签栏控制器,里面有 2 个标签。这两个选项卡都是导航控制器,每个选项卡上都有一个表格视图。
现在,当我在第一个选项卡中选择表格的一个单元格时,我正在推动另一个选项卡栏控制器,所以我想隐藏父选项卡控制器的选项卡栏,当我单击导航栏上的后退按钮时,我想再次查看父标签栏,就像我在父标签栏视图中一样。
我尝试了 hidesbottombarwhenpushed,它隐藏了父标签栏控制器标签栏,但是当我点击返回时,它不会将其返回。
好的,所以最后我得到了答案,这就是我应该做的。
self.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:aViewController animated:YES];
self.hidesBottomBarWhenPushed=NO;
所以基本上 hidesBottomBarWhenPushed = YES,然后推送你的视图控制器,然后 hidesBottomBarWhenPushed = NO; 这就像一个魅力。
接受的答案对我来说有问题。
我的应用有一个深度为三个 UIViewController 的导航。
我的解决方案是设置 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;
}
希望它有所帮助。
您还可以在选择 tabBar 控制器时使用属性检查器将其隐藏
正如 Apple 文档所述,您不能在 NavigationController 上推送 UITabBarController 实例。这有一个很好的理由:如果您在标签栏中选择了另一个项目,您如何从推送的标签栏控制器返回?
简单的答案是:不要那样做,它会让你的用户感到困惑。您可以尝试将第一个视图控制器交换为另一个可能是选项卡栏控制器的视图控制器,但不要使用推送范例:使用显式按钮代替将您的第一个选项卡栏控制器交换为第二个,最好使用视觉过渡。
您可以查看该类的setAnimationTransition:forView:cache:
文档以了解如何将标签栏控制器交换为另一个:UIView
在这种情况下,容器视图将是应用程序的窗口。
在您的 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
}
}
}
设置hidesBottomBarWhenPushed = true
在将被推送的控制器中。
隐藏所有控制器放入prepare for segue
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
segue.destination.hidesBottomBarWhenPushed = true
}