我有一个UICollectionView,我用NSFetchedResultsControllerDelegate填充。数据偶尔到来。我已经实现了插入/更新/删除/等的方法。具有FetchedResultsController委托回调的collectionView中的项目。这就是上下文。我的问题是我的自定义UICollectionViewCell中有一个UIButton,具有特定的动作和目标。因此,当collectionview使单元格出列时,我注意到有几个单元格具有相同的UIButton引用。这不酷。例如,当我点击一个按钮时,它就像我点击3个不同单元格的按钮一样。由于出列系统,这些单元实际上是相同的单元(意味着它们具有相同的内存引用)。是否有一个系统,我可以为每个单元格提供唯一的参考。我要问的是如何绕过出列系统?
答案 0 :(得分:0)
您要做的是使用其单元格的索引路径标记每个按钮,而不是“绕过出列系统”。您仍然希望使用可重复使用的按钮创建可重复使用的单元格,但是当您在{{{{}}中将单元格出列时,将该按钮的(或任何UIView
)tag
属性设置为单元格的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:
并从按钮中删除所有目标和操作。
或者,我使用的方法是使自定义单元格成为按钮目标,并使用委托回调将此操作公开给您的数据源,因此:
这解决了您的问题,因为单元格只有一个委托,而不是您所看到的多个目标操作。它还有一个额外的好处,就是让您将-prepareForReuse
私有保留在单元格中,这样,如果您想要将该按钮更改为具有手势识别器的视图,您可以更新该实现仅限单元格并保持其界面不变。
在第二种方法中,将单元格的委托设置为UIButton
中的nil
仍然是一种好习惯。