先描述本人遇到的问题:
1.在iPad上,iOS8的系统,点击某个cell,崩溃,崩溃到的位置是 [UIApplication(BTGMethodSwizzler) btg_swizzleSendEvent:]
2.在iOS 9的系统及以上,无崩溃,但是所有的cell都没有事件响应
经调研资料显示:
[UIApplication(BTGMethodSwizzler) btg_swizzleSendEvent:]
是bugtags的 .a
静态库中的一个 category
,这个 category
扩展了一个 UIApplication
类的一个方法 sendEvent:
。
通过 Hopper
查看这个 .a
静态库中的category BTGMethodSwizzler
实现了什么,然而,并没有找到原因。
然后我自己在我的app中的某个类也实现了这个category,对 btg_swizzleSendEvent:
方法进行交换,发现了一个有趣的事儿,就是我点击某个cell,被我交换的那个方法有响应了,但是并没有转发到我点击的那个cell。所以问题,就发生在了,我这个项目中,某个文件在执行代码的时候,肯定把所有的gesture都删除了,导致事件全部失效;
所以我就在我们公司的群里问了问,果真,有位同事改bug的时候,想要删除他的一个gesture,所以他的代码是 [self.superview removeGestureRecognizer:_tap];
_tap
是那个gesture的变量;
这句代码就造成了,由于在运行过程中,不知道 self.superview
是哪个,就会意外的把所有的gesture都移除掉了,主要是 _tap
变量还是 nil
所以我的解决方案就是:
- 在 remove
手势时,一定是在 [self removeFromSuperview];
之前
如果读者没有发现这样的代码,那就要检查,你app的 keywindow
和rootViewController
下的 userInteractionEnabled
是否为YES;还要检查它们的手势是否启用/可用。