闲来无事,于是,复习了一下以前学过的知识,发现之前做项目的时候我们有经常遇到有的tabBar需要隐藏,而有的不需要,按照我的惯用做法是在push前隐藏tabBar
newVc.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:newVc animated:YES];
但是在实际项目中可能会出现多个界面需要隐藏状态栏,如上这句话写上十几二十遍(如果有上百上千个怎么办)岂不是在重复劳动,程序员都不愿意干这种事情吧!那下面我就讲讲复习的过程中找到的解决方法给大家分享一下下。
需求就是不管push哪个控制器,都要自动隐藏tabBar.
思路就是不管push哪个新控制器,我们的新控制的hidesBottomBarWhenPushed都为YES,换言之,拦截push方法,说白了,就是重新建立一个导航栏控制器
看我做法,重点
在Main方法里面新建导航控制器,
在tabBarController
UINavigationController改为WJNavigationController
WJNavigationController *nav = [[WJNavigationController alloc] initWithRootViewController:childVc];
[self addChildViewController:nav];
现在的导航控制器还是UINavigationController,最真实的导航控制器是WJNavigationController
我们可以打印下控制是谁
等于就是说现在调用的是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时
当push 进来self.viewControllers.count > 0时
栈就会大于1
就此搁笔,如有更好的方法或是有纰漏,请指教。这几天会陆续更博,将以前遗漏(没留言到)的点以博客的形式记录下来