iOS 大神留步,你确定你会 (优雅) 的隐藏和显示导航栏吗?

3,639 阅读1分钟
原文链接: www.jianshu.com

欢迎动画.gif


条条大路通罗马,你是用这种方法隐藏和显示导航栏的吗?

- (void)viewWillAppear:(BOOL)animated {
 [  super viewWillAppear:animated]; 
    [self.navigationController setNavigationBarHidden:YES animated:YES];
}
- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated];
   [self.navigationController setNavigationBarHidden:NO animated:YES];
}

实话说,2015年我那会做iOS的时候也是这么做的[捂脸][捂脸],虽然当时这样做可以实现想要的结果,但是会很累,需要在控制中的每个显示和注销的- (void)viewWillAppear:(BOOL)animated - (void)viewWillDisappear:(BOOL)animated 添加一段代码。
真心讲这样写的代码很低效,自己的都不想看。为了让代码更优雅,让开发更高效,我们看看更优雅的编码方式;

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{

}

这个方法不知道大家熟不熟悉,这个就是UINavigationController代理方法中的一个,它在有导航栏的控制器中,当控制器加载完,导航栏要出现的时候会调用。
既然是导航栏要出现的时候调用,那我们是不是可以在这里做判断呢,事实证明是可以的

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{

    BOOL isHiddenNavBar = [viewController isKindOfClass:[self class]];
    [self.navigationController setNavigationBarHidden:isHiddenNavBar animated:YES];
}

当然这样做的前提是我们要实现实现UINavigationController的delegate
git: github.com/huxiao123/N…