iOS 页面卡死,但并不是 Crash 的问题解决
最近在做的一款 App 测试中出现了一个非常诡异的问题,偶尔的界面卡死,但是又并不是 Crash,没有抛出任何异常,把 App 切到后台然后在点开又恢复了,只不过转场的时候十分诡异,似乎完全没有动画,转场背景还是黑的。
什么原因呢?死循环?不可能;内存泄漏?也不可能?😂;手势冲突?很有可能🧐。无意中我发现了,在 UINavigationController 根视图上进行右滑返回上级页面时,页面就会卡死。原因找到了,一定是手势冲突。
问题原因描述
在我的项目中有一个基类 BaseViewController,由于项目中有时候需要隐藏 NavigationBar 所以我使用了 setNavigationBarHidden() 方法,使用这个方法会导致右滑返回上级页面的操作失效。所以我在 BaseViewController 中加入了如下的代码:
1 | self.navigationController?.interactivePopGestureRecognizer?.delegate = self |
我没有实现任何 UIGestureRecognizerDelegate 的方法,也就是用的都是默认情况。右滑时,具体的操作是将导航栏堆栈最顶部的 Controller 进行 pop 操作,但是当栈顶没有 Controller 时,也就是 Controller 为 rootViewController 时,这时候去开启右滑就会出问题了。导致页面完全卡死。
问题修复
我们为我们的控制器基类 BaseViewController 添加一个 public 的属性,如下所示:
1 | public var disableSideSliding = false |
我们实现 UIGestureRecognizerDelegate 代理中的方法:
1 | extension BaseViewController: UIGestureRecognizerDelegate { |
在我们所有的根视图,也就是 rootViewController 的 viewDidLoad() 方法中将右滑操作禁止,即设置 disableSideSliding 属性值为 true。
Ok,问题解决。