3

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

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

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

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

谢谢,卡洛斯

4

3 回答 3

0

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

于 2015-11-04T20:00:58.340 回答
0

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

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

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

于 2015-11-04T20:03:19.303 回答
0

就是这样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!
    }

免责声明:

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

于 2015-11-04T20:03:55.463 回答