页面导航条的二级页面返回按钮设置为自定义按钮后,侧拉返回事件就会失效。
在导航控制器的rootVC添加如下代码可解决:
loadView或者viewdidLoad中添加:
self.navigationController?.interactivePopGestureRecognizer?.delegate = nil
viewDidAppear 和 viewWillDisappear 也需要作如下调整
override func viewDidAppear(_animated:Bool) {
super.viewDidAppear(animated)
self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
}
override func viewWillDisappear(_animated:Bool) {
super.viewWillDisappear(animated)
self.navigationController?.interactivePopGestureRecognizer?.isEnabled = true
}
问题思路:
开始我只是isEnabled开启侧拉手势,二级页面自定义返回按钮后的侧拉返回顺利解决。
但是返回到了rootVC中,如果继续右拉返回,问题就出现了。
系统直接闪退!!!
看了下问题,是栈到了最前方,再拉就没VC了,可手势还在响应,于是一个红色的警告跳到了屏幕上,栈溢出了。。。
草泥马啊,这是苹果的问题吧。
emmmmmmmmmmmmmmmmmm............................................
那该怎么解决rootVC继续侧拉时闪退的问题呢?
既然侧拉手势能开启,那关闭也可以吧?
于是我在rootVC 的 viewWillAppear 中关闭,viewWillDisappear开启。
测试了一下,开启后再关闭确实解决了问题。
侧拉返回时崩溃的问题解决了。重新打包给测试,但还是反馈有侧拉失效的问题!!!
复现操作:进入二级页面,侧拉返回到一半,取消侧拉,再回到二级页面。再次侧拉时,失效了。。。。。。。。。
那到底什么时候关闭呢?什么时候再开启呢?
梳理一下逻辑:
1、即将离开首页时:viewWillDisappear
2、已经离开首页时: viewDidDisappear
3、侧拉开始响应,即将进入首页时: viewWillAppear
4、侧拉结束已经进入首页时:viewDidAppear
1和2,3和4都是隔了一个动画的时间,点击按钮触发push或返回是隔了动画的时间,侧拉返回是隔了从手指拖动到动画完成的时间。
在进入页面后和即将离开页面时操作rootVC是最安全的,所以,即将离开时开启侧滑,已经进入页面后关闭侧滑,就有了开头的解决方案代码⬆️。