发出出列UICollectionViewCell的问题

时间:2015-03-06 10:00:11

标签: ios uitableview swift uicollectionview uicollectionviewcell

我有一个UICollectionView,我用NSFetchedResultsControllerDelegate填充。数据偶尔到来。我已经实现了插入/更新/删除/等的方法。具有FetchedResultsController委托回调的collectionView中的项目。这就是上下文。我的问题是我的自定义UICollectionViewCell中有一个UIButton,具有特定的动作和目标。因此,当collectionview使单元格出列时,我注意到有几个单元格具有相同的UIButton引用。这不酷。例如,当我点击一个按钮时,它就像我点击3个不同单元格的按钮一样。由于出列系统,这些单元实际上是相同的单元(意味着它们具有相同的内存引用)。是否有一个系统,我可以为每个单元格提供唯一的参考。我要问的是如何绕过出列系统?

2 个答案:

答案 0 :(得分:0)

您要做的是使用其单元格的索引路径标记每个按钮,而不是“绕过出列系统”。您仍然希望使用可重复使用的按钮创建可重复使用的单元格,但是当您在{{{{}}中将单元格出列时,将该按钮的(或任何UIViewtag属性设置为单元格的indexPath。 1}}。

cellForRowAtIndexPath

然后当您使用该按钮作为发件人调用函数时,您可以访问该标记:

cell.someButton.tag = indexPath.row

注意:@IBAction func someButtonPressed(sender: UIButton) { let index = sender.tag // Do something unique to that cell with that tag } 的{​​{1}}属性是UIView,因此如果您需要整个索引路径,这在使用获取的结果控制器时非常有用,您可以继承{ {1}}并为其提供一个属性,您可以在其中存储索引路径,并以相同的方式设置和检索它。

答案 1 :(得分:0)

我猜你在TransactionStatus.isNewTransaction()设置了按钮的目标和动作。在自定义单元格中,您可以覆盖-collectionView:cellForItemAtIndexPath:并从按钮中删除所有目标和操作。

或者,我使用的方法是使自定义单元格成为按钮目标,并使用委托回调将此操作公开给您的数据源,因此:

  1. 按下按钮
  2. 在单元格上调用操作方法
  3. Cell通知其代表它应该做某事
  4. 这解决了您的问题,因为单元格只有一个委托,而不是您所看到的多个目标操作。它还有一个额外的好处,就是让您将-prepareForReuse私有保留在单元格中,这样,如果您想要将该按钮更改为具有手势识别器的视图,您可以更新该实现仅限单元格并保持其界面不变。

    在第二种方法中,将单元格的委托设置为UIButton中的nil仍然是一种好习惯。