iOS 页面卡死,但并不是 Crash 的问题解决

最近在做的一款 App 测试中出现了一个非常诡异的问题,偶尔的界面卡死,但是又并不是 Crash,没有抛出任何异常,把 App 切到后台然后在点开又恢复了,只不过转场的时候十分诡异,似乎完全没有动画,转场背景还是黑的。

什么原因呢?死循环?不可能;内存泄漏?也不可能?😂;手势冲突?很有可能🧐。无意中我发现了,在 UINavigationController 根视图上进行右滑返回上级页面时,页面就会卡死。原因找到了,一定是手势冲突。

问题原因描述


在我的项目中有一个基类 BaseViewController,由于项目中有时候需要隐藏 NavigationBar 所以我使用了 setNavigationBarHidden() 方法,使用这个方法会导致右滑返回上级页面的操作失效。所以我在 BaseViewController 中加入了如下的代码:

1
2
3
4
self.navigationController?.interactivePopGestureRecognizer?.delegate = self

extension BaseViewController: UIGestureRecognizerDelegate {
}

我没有实现任何 UIGestureRecognizerDelegate 的方法,也就是用的都是默认情况。右滑时,具体的操作是将导航栏堆栈最顶部的 Controller 进行 pop 操作,但是当栈顶没有 Controller 时,也就是 ControllerrootViewController 时,这时候去开启右滑就会出问题了。导致页面完全卡死。

问题修复


我们为我们的控制器基类 BaseViewController 添加一个 public 的属性,如下所示:

1
public var disableSideSliding = false

我们实现 UIGestureRecognizerDelegate 代理中的方法:

1
2
3
4
5
extension BaseViewController: UIGestureRecognizerDelegate {
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
return !disableSideSliding
}
}

在我们所有的根视图,也就是 rootViewControllerviewDidLoad() 方法中将右滑操作禁止,即设置 disableSideSliding 属性值为 true

Ok,问题解决。