<iOS>如何巧妙隐藏TabBar?

2017-06-21  本文已影响2328人  天堂秀

闲来无事,于是,复习了一下以前学过的知识,发现之前做项目的时候我们有经常遇到有的tabBar需要隐藏,而有的不需要,按照我的惯用做法是在push前隐藏tabBar

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

但是在实际项目中可能会出现多个界面需要隐藏状态栏,如上这句话写上十几二十遍(如果有上百上千个怎么办)岂不是在重复劳动,程序员都不愿意干这种事情吧!那下面我就讲讲复习的过程中找到的解决方法给大家分享一下下。

需求就是不管push哪个控制器,都要自动隐藏tabBar.

思路就是不管push哪个新控制器,我们的新控制的hidesBottomBarWhenPushed都为YES,换言之,拦截push方法,说白了,就是重新建立一个导航栏控制器

看我做法,重点
在Main方法里面新建导航控制器,

image.png

在tabBarController

image.png

UINavigationController改为WJNavigationController

    WJNavigationController *nav = [[WJNavigationController alloc] initWithRootViewController:childVc];
    
    [self addChildViewController:nav];

现在的导航控制器还是UINavigationController,最真实的导航控制器是WJNavigationController
我们可以打印下控制是谁

image.png

等于就是说现在调用的是WJPush 方法

实现WJPush方法就能拦截所有控制器

所以 思路清楚了吗?

话不多说了
上代码
WJNavigationController.m文件

#import "WJNavigationController.h"

@interface WJNavigationController ()

@end

@implementation WJNavigationController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}


/**
 能拦截所有push进来的子控制器
 */
-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
//    NSLog(@"pushViewController--%@",viewController);

    [super pushViewController:viewController animated:animated];
}

现在有个问题,一进来tabBar就不见了,一进来就是首页,所以,我们要加个判断
那什么情况下会执行这行代码?
进来的时候不是栈底控制器
因为导航控制器是通过栈来控制的
那怎么样实现不是栈底控制器呢?
\self.viewControllers == 0就是栈底控制器,就是最先控制器
数组放所有的控制器,如果数组个数大于0,证明控制器有东西,

#import "WJNavigationController.h"

@interface WJNavigationController ()

@end

@implementation WJNavigationController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}


/**
 能拦截所有push进来的子控制器
 */
-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
//    NSLog(@"pushViewController--%@",viewController);
    NSLog(@"%@ %d",viewController,self.viewControllers.count);
    //如果现在push的不是栈底控制器(最先push进来的那个控制器)
    if (self.viewControllers.count > 0) {

        viewController.hidesBottomBarWhenPushed = YES;
    }
    [super pushViewController:viewController animated:animated];
}

我们来看打印

self.viewControllers.count == 0时


self.viewControllers.count == 0

当push 进来self.viewControllers.count > 0时

self.viewControllers.count > 0

栈就会大于1

就此搁笔,如有更好的方法或是有纰漏,请指教。这几天会陆续更博,将以前遗漏(没留言到)的点以博客的形式记录下来

上一篇下一篇

猜你喜欢

热点阅读