0
点赞
收藏
分享

微信扫一扫

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


举报

相关推荐

0 条评论