美文网首页
<iOS>如何巧妙隐藏TabBar?

<iOS>如何巧妙隐藏TabBar?

作者: 天堂秀 | 来源:发表于2017-06-21 13:11 被阅读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

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

    相关文章

      网友评论

          本文标题:<iOS>如何巧妙隐藏TabBar?

          本文链接:https://www.haomeiwen.com/subject/dvygqxtx.html