如何在我的自定义导航控制器中隐藏标签栏?

Posted

技术标签:

【中文标题】如何在我的自定义导航控制器中隐藏标签栏?【英文标题】:How to hide tab bar in my custom navigation controller? 【发布时间】:2017-02-18 06:30:27 【问题描述】:

我想在将新视图控制器推入UINavigationController 时隐藏底部标签栏(我使用的是默认标签栏)。我通过继承UINavigationController 并创建我的自定义导航控制器来做到这一点。

我重写了以下两个函数:

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated 
    self.tabBarController.tabBar.hidden = YES;
    [super pushViewController:viewController animated:YES];


- (UIViewController *)popViewControllerAnimated:(BOOL)animated 
    NSLog(@"NavigationController: View controller count = %lu", self.viewControllers.count);
    if (self.viewControllers.count <= 2) 
        self.tabBarController.tabBar.hidden = NO;
    
    return [super popViewControllerAnimated:animated];

在应用委托中:

// Use my custom navigation controller
NavigationController *myNav1 = [[NavigationController alloc] initWithRootViewController:myView];
myNav1.navigationBar.translucent = NO;
myNav1.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"abc" image:[UIImage imageNamed:@"abc"] selectedImage:[UIImage imageNamed:@"abc"]];

...

self.tabController.viewControllers = [NSArray arrayWithObjects:myNav1, myNav2, myNav3, myNav4, nil];

问题:

    当推送新的视图控制器时,底部栏会立即隐藏,我希望它看起来像被视图控制器推送。 当我尝试使用手势返回之前的视图控制器时,底部栏会显示,即使我停止返回,它也不会隐藏。

我知道一个标志hidesBottomBarWhenPushed。如果我使用该标志,则每次需要推送视图控制器时都需要将其设置为YES。这有点复杂。

有没有办法在我的自定义导航控制器中解决这些问题?

【问题讨论】:

你使用默认标签栏还是自定义标签栏? @ravi.p 我正在使用默认标签栏。 在应用委托中获取一个 UINavigationController 对象,并在 didFinishLaunchingWithOptions 中为其分配 self.appNavController = (UINavigationController *)self.window.rootViewController;所以当你想在没有标签栏的情况下推送时,请使用应用程序委托 检查这个答案:***.com/a/11490623/4831524 【参考方案1】:

似乎解决了我的问题(代码不是很好,稍后会做一些更新):

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated 
    NSLog(@"NavigationController.pushViewController: view controller count %lu", self.viewControllers.count);

    UIViewController *lastVC = nil;
    if (self.viewControllers.count > 0) 
        lastVC = self.viewControllers[self.viewControllers.count - 1];
    
    if (lastVC != nil) 
        lastVC.hidesBottomBarWhenPushed = YES;
    
    [super pushViewController:viewController animated:YES];
    if (self.viewControllers.count == 2) 
        lastVC.hidesBottomBarWhenPushed = NO;
    

【讨论】:

以上是关于如何在我的自定义导航控制器中隐藏标签栏?的主要内容,如果未能解决你的问题,请参考以下文章

如何让自定义导航控制器为每个故事板提供相同的自定义导航栏按钮

使用标签栏控制器实现导航栏项目的更简单方法?

单击 UITabBarController 时的自定义操作

自定义以编程方式创建的导航栏的背景图像

Wordpress 导航栏中的自定义简码

推送 UIViewController 的自定义导航栏