您可以将状态存储在自定义 UICollectionViewCell 中吗?或者状态是否可以被删除(比如当单元格滚出屏幕时)?

Can you store state in a custom UICollectionViewCell? Or can the state get erased (like when the cell scrolls off the screen)?

如果我创建一个 UICollectionViewCell 子类,例如:

class StudentCell: UICollectionViewCell {
    var student: Student?
}

在我的控制器中,我实现了 UICollectionView 的 didSelectItemAtIndexPath 并设置了变量:

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
    if let studentCell = collectionView.cellForItemAtIndexPath(indexPath) as? StudentCell {
        studentCell.student = self.someStudent
    }
}

当我点击单元格时,它应该设置学生,但如果单元格滚动到屏幕外,似乎整个单元格可能会被擦除,当它回到屏幕上时,它需要在 cellForItemAtIndexPath.

我遇到的问题是我有一个 UICollectionView,其中的单元格不会滚动到我正在存储数据的屏幕上。因为它们不会离开屏幕我认为它们不应该被擦除,但其中一个单元格似乎并没有保持它的可变性,这让我觉得它可能被擦除并且我可能需要将单元格外部的状态移动到字典或其他东西并在 didSelectItemAtIndexPath 我没有在单元格中设置变量,而是设置了字典。每当我需要访问数据而不是向单元格询问数据时,我都会在字典中查找它。

但不管怎样,我想知道是否可以(或一个坏主意)将其设置在单元格中。

是的,UICollectionViewUITableView 中的单元格可以(将)由系统自行决定重复使用,不应用于存储状态信息,仅用于显示信息。具体来说,两个视图在滚动到屏幕外时都会重用单元格,但不能保证这是唯一一次重用它们。处理这个问题的通常方法是定义某种单元格数据对象,它存储每个单元格(可见和不可见)的数据,并将单元格视图刷新为 needed/requested.

表格在单元格中显示数据。一个单元格与一行相关,但并不完全相同。单元格是显示一行数据的视图,这些数据恰好在那个时刻可见。如果您的 table 一次可以在屏幕上显示 10 行,那么它只有 10 个单元格,即使实际数据可能有数百行。每当一行滚出屏幕并变得不可见时,它的单元格将被重新用于滚动到屏幕中的新行。