解决UIButton在UICollectionViewCell里不能点击的问题

准备做成一个系列,不定时更新,记录iOS开发中碰到的那些坑。

习惯了用XCode Interface Builder来开发iOS UI,方便快捷,但经常会碰到一些莫名其妙的坑,比如今天就碰到了在UICollectionViewCell中的UIButton不能响应点击事件(TouchUpInside)。

先说一下场景:UICollectionViewCell的UI是定义在一个xib文件里的,UIButton也是通过IB放在Cell里,然后对Cell里的控件建立了几个IBOutletIBAction,这里的IBAction就是上文里说的button点击事件。

所有的IBOutlet都工作正常,而IBAction死活不起作用。首先想到的是最外层的View block里子View的点击事件userInteractionEnabled = NO,检查了好几遍都没有。

后面在Stack Overflow上看到可以用hitTest的方法检测当前的触点,如果是那个Button就在pointInside方法里返回true。这样确实是可行的,但是太麻烦,不是最优解。一个这么常见的操作出问题,十有八九是什么地方疏忽了,不到万不得已还是不要用hitTestpointInside

就这样磨了几个小时,后面发现原来问题出在我创建UICollectionViewCell的xib文件时拖进去的root View是一个UIView,而不是UICollectionViewCell,虽然我后面在Identity Inspector里把class改成了UICollectionViewCell,但XCode仍然固执地认为它是一个UIView,所以导致了UIButton不能点击的异常。

找到了原因,解决起来就快了,重新拖一个UICollectionViewCell作为xib的root View,然后把原来的页面元素copy进去,再处理一下因为copy导致的Auto Layout Constraints issue就一切正常了!