UICollectionView 单元格和按钮

Posted

技术标签:

【中文标题】UICollectionView 单元格和按钮【英文标题】:UICollectionViewCells and Buttons 【发布时间】:2013-06-18 11:21:07 【问题描述】:

我一直试图让我的UICollectionView 对单击和双击做出不同的反应,但我发现的所有答案似乎都表明这并不可行,因为首先识别出单击。它适用于非常慢的点击,但任何更快的东西总是会启动默认手势识别器(如果有人让它工作,我很想知道)......

所以无论如何,我现在已经将按钮放在我的 UICollectionViewCell(它有自己的类和 NIB 文件)中。

问题是这样的:

在collectionView 的UIViewController 中使用按钮的最佳方式是什么?

我目前在UICollectionViewCell 的子类的标头中有一个protocol,并已将我的viewController 声明为delegate 并实现了所需的协议功能。

collectionView:cellForItemAtIndexPath: 中,我将 VC 设置为单元格的委托。

一切正常,但似乎有点啰嗦,而且可能不是一个好方法。

我想到的另一种方法是不使用委托来简单地调用 UICollectionViewCellcollectionView:cellForItemAtIndexPath: 的属性上的 addTarget:Action:

这似乎更简单,但委托模式在我看来更合适。

欢迎任何和所有关于哪个更好、为什么以及任何更合适的替代方案的建议!

谢谢。

【问题讨论】:

【参考方案1】:

您使用委托模式的想法是正确的。视图的任何操作的最终责任对象是显示这些视图的视图控制器。因此,将它用作您单元格协议的委托是正确的。

【讨论】:

詹卢卡,谢谢。我在这种方法和只是将操作添加到“collectionView:cellForItemAtIndexPath:”中的按钮之间纠结。有什么想法会更好……或者为什么? 您可以将按钮的操作放在 viewController 的代码中,但那将是糟糕的面向对象代码。您的 viewController 不需要知道动作是如何触发的:它可能是一个按钮、一个手势识别器、一个从其他对象对单元格本身的 API 调用。没关系。您的 viewController 应该只关心处理单元告诉他已经发生的操作。因此,这只是一种很好的 OOP 实践,可以让您的代码更可重用。 谢谢,你这么说就很明显了。【参考方案2】:

创建UICollectionViewCell 的自定义子视图并将您的按钮放在initWithFrame 方法中。将按钮声明为公开,以便稍后在您的uicollectionviewcontrolleruicollectionview 中使用它(如果以编程方式创建)。

【讨论】:

Meenakshi,感谢您的快速回答,但这对我来说没有意义......并不意味着你错了,我只是不明白。

以上是关于UICollectionView 单元格和按钮的主要内容,如果未能解决你的问题,请参考以下文章

从 UICollectionViewCell 中删除单元格和相应的图像?

两个 UICollectionView 的初始化和切换

使用 UICollectionView 页脚中的对象

UICollectionview 不重绘渐变按钮

UICollectionView 不重用单元格

如何在 UICollectionView 上设置单元格的位置