UICollectionViewCells deque returns 错误的单元格

UICollectionViewCells deque returns wrong cell

我有一个 CollectionView,我使用单元格来显示视频,我还在变量上存储一些其他数据。每当我滚动时,我都会使用以下代码重复使用以前的单元格:

let cell = collectionView.dequeueReusableCellWithReuseIdentifier("profileCell", forIndexPath: indexPath) as! ProfileCollectionViewCell

但我注意到,当我使用以前使用过的 indexPath 时,我没有返回与之前相同的单元格,而是显然以随机顺序返回另一个单元格。我想避免在不需要时重新加载视频。

有没有办法让我使用相同的单元格来使用相同的indexPath

谢谢, 卡洛斯

您正在使用可重复使用的电池。这样你就不能确定你总是得到同一个细胞,它几乎总是相反的。您可以尝试在首次加载时存储单元格,然后在 cellForRow 中检查它。但我认为更好的方法是将视频存储到文件中(当然有限制),因为存储单元格不是最佳选择。

您无法影响从 dequeueReusableCellWithReuseIdentifier 返回的单元格实例。因此,当单元格滚动到屏幕外时,您无法将视频保留在单元格中。

您可以做的是将 NSMutableDictionary 属性 添加到视图控制器并在其中存储对视频的引用(使用单元格的 indexPath 作为键)。您可以将引用存储在 tableView(_:didEndDisplayingCell:forRowAtIndexPath:).

然后,当您从 dequeueReusableCellWithReuseIdentifier 中获取一个单元格时,您可以从字典中检索到视频并将其添加到单元格中。这样,您从队列中取回哪个单元格都没有关系。

这就是 collectionView.dequeueReusableCellWithReuseIdentifier 的工作原理。 如果你想绕过这个功能,你可以保存在一个数组中创建的所有单元格,然后你可以获取已经加载视频的单元格而不是出列。但是,如果您使用某些框架在加载视频后缓存视频,则根本不需要处理这个问题。

var cells: [CustomCollectionViewCell] = []

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        var cell:CustomCollectionViewCell?
        if cells.count >= indexPath.row {
            cell = cells[indexPath.row]
        } else {
            cell = CustomCollectionViewCell()
            //setup cell
            cells.append(cell)
        }

        return cell!
    }

免责声明:

这个解决方案是一个 hack。正如 @Async 在下面的评论中提到的,如果您创建大量单元格,此解决方案将使用大量内存。