我们都知道iOS7以后,系统UINavigationController自带侧滑返回上一级。它是通过navigationController中的interactivePopGestureRecognizer属性来控制。
某一天测试妹妹跑过来跟我说,我测出一个bug,进去某一个页面后回到RootViewController,左滑会导致视图堆栈变乱。我试了一下,果真如此。我想起以前曾经遇到一个bug,如果是自定义UINavigationController并且设置了自定义的leftBarButtonItem,那在UINavigationController的rootViewController上滑动返回时,会出现界面卡死的情况。
赶紧查了一下我们的自定义XXNavigationController,缺失设置了leftBarButtonItem。但是仔细查看了代码,我们其实是禁止了rootViewController左滑返回的事件。
|
|
天了噜!这应该没有问题的,什么情况。经过一番仔细查看,发现只有进入某个页面,左滑才会出这个问题。到底这个做了什么?终于被我发现一行要命的代码。
|
|
interactivePopGestureRecognizer的代理被设置成nil了。。。。
怎么处理好呢?
首先,创建一个类XXXDelegate专门处理侧滑手势的delegate事件。并实现上面“gestureRecognizerShouldBegin:gestureRecognizer”方法的处理。
接着,在XXTabbarController把每个NavgationController对应创建一个XXXDelegate。每次回到TabbarController任意一个子页面“viewDidAppear”的时候,把对应ChildViewController的NavgationController的interactivePopGestureRecognizer.delegate设置成对应的XXXDelegate;
结论,这样不论哪个页面把interactivePopGestureRecognizer的代理设置成nil,都能保证回到rootViewController,interactivePopGestureRecognizer.delegate都能设置成功。