UIApplication(BTGMethodSwizzler) btg_swizzleSendEvent: 崩溃

先描述本人遇到的问题:

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的 keywindowrootViewController 下的 userInteractionEnabled 是否为YES;还要检查它们的手势是否启用/可用。

猜你喜欢

转载自blog.csdn.net/u013538542/article/details/80343208