一个 collectionViewCell 不能点击的问题

这只是一个个例, 并不一定适用其他情况.

原型

需要在一个 collectionView 中嵌套collectionView. 大概效果是这样的:

问题

在点击里面的时候没有触发已经定义的方法

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) 

另外还发现的是, 这个问题是出现在使用代码直接生成页面的方式中, 使用 storyboard 或 xib 的时候, 却没有问题.

解决

在外面的 cell 中设计了两个 view: 一个显示上面的标题(view1), 一个显示下面的collectionView(view2). 本来设想的是,可以在 view2中显示不同的内容, 比如有的 cell 可能会放 collectionView, 有的要直接放 Image, 也就是当做一个容器来使用的.

问题就出在这个 view2 上.

这个 view2 在初始化的时候, 没有定义它的 frame, 导致在页面上是看不到, 但能看到放在它里面的 image 和 label.

那么解决的方法, 一种是为这个 view2设置合适的大小, 来容纳下里面的 collectionView. 另外一种, 就是去掉这个 view2, 直接将里面的 collectionView 放到外面 cell 的contentView.

这也解释了, 为什么在使用 stroyboard 和 xib 的时候没有问题, 因为在拖拽的时候已经为这个 view 定义了大小样式.

经验教训

1.多余的 view 不要出现

2.使用 programmatically 和 stroyboard 都不容易维护和定位问题, 最好还是用 xib 吧


另外, google 的时候找到一个也是didSelectItemAtIndexPath失效的帖子, 虽然跟这个问题关系不大, 也一并记录一下.
参考: didSelectItemAtIndexPath Doesn't Work In Collection View Swift
UICollectionView didSelectItemAtIndexPath not called when tapped on UITextView

didSelectItemAtIndexPath is called when none of the subView of collectionViewCell respond to that touch. As the textView respond to those touches, so it won't forward those touches to its superView, so collectionView won't get it.

2016-02-25 10:000