iOS 的navigationBar偶尔显示上一个页面的navigationBar

某个项目的需求是,有些页面的navigationBar要显示,有些不要显示,有些是白色,有些是黑色,有些要有底下的线,有些不要有线……总之navigationBar备受折磨。

在这种情况下,我作死地使用了系统原生的navigationBar。在ViewController的公共父类里是这么写的:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    [self.navigationController setNavigationBarHidden:self.hidesNavigationBar animated:YES];
    
    if (self.hidesBottomLine) {
        [[WNYNavigationController sharedInstance].navigationController.navigationBar setBackgroundImage:[UIImage new] forBarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];
        [[WNYNavigationController sharedInstance].navigationController.navigationBar setShadowImage:[UIImage new]];
    } else {
        [[WNYNavigationController sharedInstance].navigationController.navigationBar setBackgroundImage:nil forBarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];
        [[WNYNavigationController sharedInstance].navigationController.navigationBar setShadowImage:nil];
    }
    
}

一般情况下都是正常的。但是在偶然情况下,会出现这样的bug:进入新界面后,新界面的navigationBar会突然消失,出现的还是上一个界面的 navigationBar。从此以后,navigationBar 全乱了,各种错乱,比如push进的 viewController 的 navigationBar 一闪即消失,然后还是显示上一层的 bar 等等…… kill 掉重新进,恢复正常。

这种情况无法必现,并且重现概率很低,似乎跟快速地右划返回有一定关系。我现在倾向于认为是一个系统的bug。想请教大家,有遇到过类似的情况吗?请问有什么办法能尽量避免呢?谢谢!

阅读 6k
1 个回答

最后找到问题所在:

在调用[self.navigationController setNavigationBarHidden:YES animated:YES];后,非常短的时间内调用[self.navigationController setNavigationBarHidden:NO animated:NO];,会导致 navigationBar 全部错乱。大概就是动画进行过程中,再去更改 navigationBar 的显示,就会错乱。

应该是系统的一个bug,只能尽量避免。要么不要短时间同时调用,要么把 animated 全都设成 YES 似乎就没有问题了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题