[iOS]一个 iOS 8.1 上关于 UINavigationController 的 NavigationBar 混乱的 Bug

首先说明, 这是一个会在 iOS 8.1 模拟器上稳定复现的关于 UINavigationController 的 bug, 在 iOS 8.2 已经修复, 在 8.1 的真机上会出现但不肯定会稳定复现, 因为在我查明这个 bug 的原因的时候, 我手头的设备刚刚升级到 8.2, 所以也没法测试了. 8.0 的系统完全没有测试过, 7.x 的系统可以肯定没有这个问题. 既然这个问题修复了本文也本没必要写, 但考虑到可能有些越狱用户会停留在 8.1 系统, 为了让其他遇到同样问题的开发者可以找到解决方案, 所以还是发一下.

这个 bug 的具体复现方法如下:

  1. 准备三个 UIViewContoller(vc1 vc2 vc3), 三个 viewController 的 title 分别设置为 @”1″, @”2″, @”3″. vc1 和 vc2 均实现 - (BOOL)prefersStatusBarHidden {return YES;} 方法, vc3 保持原状.

  2. 将 vc1 作为 UINavigationControllerrootViewController, push vc2, push vc3.

  3. 点击 navigation bar 上面的返回按钮, 可以发现 UINavigationController 本应 pop vc3, 到达 vc2, 但实际上, 虽然 pop vc3, 显示了 vc 2, 但是 navigation bar 的 title 却显示为 @”1″, 如果你的 vc1 上设置了自定义的 barButtonItems, 那么这些 barButtonItems 也会同样显示出来. 换句话说, view 只 pop 了一层, 但是 navigation bar 却直接跳了两层. 更进一步, 如果在 vc1 前还有 vc0, vc-1… 那么你可以发现在逐一 pop 这些 viewController 的时候或有 viewController 被跳过.

Bug 的原因就是三个 viewController 的 prefersStatusBarHidden 设置不统一, 改成一致后就无此问题.

既然是系统的 Bug, 那就只能避免, 没法修复. 万幸的是这种 bug 的产生情况应该比较少见, 而且新的系统已经修复.

测试代码在 github

–以上–