准备做成一个系列,不定时更新,记录iOS开发中碰到的那些坑。
习惯了用XCode Interface Builder来开发iOS UI,方便快捷,但经常会碰到一些莫名其妙的坑,比如今天就碰到了在UICollectionViewCell
中的UIButton
不能响应点击事件(TouchUpInside)。
先说一下场景:UICollectionViewCell
的UI是定义在一个xib文件里的,UIButton
也是通过IB放在Cell里,然后对Cell里的控件建立了几个IBOutlet
和IBAction
,这里的IBAction
就是上文里说的button点击事件。
所有的IBOutlet
都工作正常,而IBAction
死活不起作用。首先想到的是最外层的View block里子View的点击事件userInteractionEnabled = NO
,检查了好几遍都没有。
后面在Stack Overflow上看到可以用hitTest
的方法检测当前的触点,如果是那个Button就在pointInside
方法里返回true。这样确实是可行的,但是太麻烦,不是最优解。一个这么常见的操作出问题,十有八九是什么地方疏忽了,不到万不得已还是不要用hitTest
和pointInside
。
就这样磨了几个小时,后面发现原来问题出在我**创建UICollectionViewCell
的xib文件时拖进去的root View是一个UIView
,而不是UICollectionViewCell
,虽然我后面在Identity Inspector里把class改成了UICollectionViewCell
,但XCode仍然固执地认为它是一个UIView
**,所以导致了UIButton不能点击的异常。
找到了原因,解决起来就快了,重新拖一个UICollectionViewCell
作为xib的root View,然后把原来的页面元素copy进去,再处理一下因为copy导致的Auto Layout Constraints issue就一切正常了!