首先说明, 这是一个会在 iOS 8.1 模拟器上稳定复现的关于 UINavigationController 的 bug, 在 iOS 8.2 已经修复, 在 8.1 的真机上会出现但不肯定会稳定复现, 因为在我查明这个 bug 的原因的时候, 我手头的设备刚刚升级到 8.2, 所以也没法测试了. 8.0 的系统完全没有测试过, 7.x 的系统可以肯定没有这个问题. 既然这个问题修复了本文也本没必要写, 但考虑到可能有些越狱用户会停留在 8.1 系统, 为了让其他遇到同样问题的开发者可以找到解决方案, 所以还是发一下.
这个 bug 的具体复现方法如下:
-
准备三个 UIViewContoller(vc1 vc2 vc3), 三个 viewController 的 title 分别设置为 @”1″, @”2″, @”3″. vc1 和 vc2 均实现
- (BOOL)prefersStatusBarHidden {return YES;}
方法, vc3 保持原状. -
将 vc1 作为
UINavigationController
的rootViewController
, push vc2, push vc3. -
点击 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
–以上–