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,问题解决。