UIAlert弹窗展示时pushViewController失效问题及原因解析
iOS弹窗后pushViewController不生效的问题排查与解决
问题重现
我为UIViewController实现了一个+UIAlert分类扩展,在业务页面的findUser方法中,当userService查询用户出错时,先调用扩展的alert弹窗提示错误信息,随后立即调用doAuth方法(内部通过navigationController?.pushViewController跳转至登录页)。但实际运行时,点击弹窗的OK按钮后,弹窗消失,但登录页并没有被push出来。
解决方案
修改UIAlert扩展,为alert方法添加完成回调闭包,将doAuth的调用逻辑放入这个回调中,页面跳转功能恢复正常。
原因解析
控制台会输出关键提示:
pushViewController在已有过渡或展示操作时调用,导航栈不会更新。
弹窗展示的过程属于界面过渡操作,此时系统的界面焦点被弹窗占用,导航控制器处于"忙"的状态。如果在弹窗还未完成展示(或还未完全消失)时就调用pushViewController,系统会直接忽略这个导航栈更新请求。只有等弹窗的过渡操作完全结束(即用户点击OK后弹窗彻底消失),再执行跳转逻辑,才能触发导航控制器正常处理页面跳转。
内容的提问来源于stack exchange,提问作者Krzysztof P
相关产品推荐
相关产品推荐

