Nested pop/push 导致的问题

有这样一个场景:当一个 ViewControllerA 出现的时候,我们检查某个状态值,如果符合条件就用 pushViewControllerpopViewController 跳转到另一页面。

很容易想到的方法就是在 ViewControllerA 的 viewDidLoad 或者 viewWillAppear 中来检查状态并跳转。但这时候系统会给出警告:

nested push animation can result in corrupted navigation bar.

Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.

或者

Unbalanced calls to begin/end appearance transitions for

并且可能导致 navigationController 的标题栏出现重影甚至崩溃。

导致这个问题的原因是:当一个 ViewController 的出现有动画时viewWillAppearviewDidAppear 是应该成对出现的,如果在 viewDidAppear 被调用之前 push/popViewController 会导致转换过程在 viewDidAppear 还没被调用时就终止,系统处在一个错误的中间态。

这里说的动画包括这个 ViewController 被 push 时有动画和下一个 ViewController 被 pop 时有动画。

解决方法显然有两种,一种是去掉动画;另一种是在viewDidAppear中调用push/popViewController,但是这样会导致动画完成时前一个画面会闪现一下才切换到下一个画面,目前还没有找到避免的方法。

给鸡排饭加个蛋