iOS侧滑出现的卡死Bug

我们都知道iOS7以后,系统UINavigationController自带侧滑返回上一级。它是通过navigationController中的interactivePopGestureRecognizer属性来控制。

某一天测试妹妹跑过来跟我说,我测出一个bug,进去某一个页面后回到RootViewController,左滑会导致视图堆栈变乱。我试了一下,果真如此。我想起以前曾经遇到一个bug,如果是自定义UINavigationController并且设置了自定义的leftBarButtonItem,那在UINavigationController的rootViewController上滑动返回时,会出现界面卡死的情况。

赶紧查了一下我们的自定义XXNavigationController,缺失设置了leftBarButtonItem。但是仔细查看了代码,我们其实是禁止了rootViewController左滑返回的事件。

1
2
3
4
5
6
7
8
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if (gestureRecognizer == self.interactivePopGestureRecognizer) {
if (self.viewControllers.count <= 1 ||
self.visibleViewController == [self.viewControllers firstObject]) {
return NO;
}
return YES;
}

天了噜!这应该没有问题的,什么情况。经过一番仔细查看,发现只有进入某个页面,左滑才会出这个问题。到底这个做了什么?终于被我发现一行要命的代码。

1
self.navigationController.interactivePopGestureRecognizer.delegate = nil;

interactivePopGestureRecognizer的代理被设置成nil了。。。。
怎么处理好呢?

首先,创建一个类XXXDelegate专门处理侧滑手势的delegate事件。并实现上面“gestureRecognizerShouldBegin:gestureRecognizer”方法的处理。

接着,在XXTabbarController把每个NavgationController对应创建一个XXXDelegate。每次回到TabbarController任意一个子页面“viewDidAppear”的时候,把对应ChildViewController的NavgationController的interactivePopGestureRecognizer.delegate设置成对应的XXXDelegate;

结论,这样不论哪个页面把interactivePopGestureRecognizer的代理设置成nil,都能保证回到rootViewController,interactivePopGestureRecognizer.delegate都能设置成功。

Blacktea wechat
ex. subscribe to my blog by scanning my public wechat account
记录生活于感悟,您的支持将鼓励我继续创作!