我有CollectionView
,我使用单元格来显示视频,我还在变量上存储了一些其他数据。每当我滚动时,我都会使用以下代码重用以前的单元格:
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("profileCell", forIndexPath: indexPath) as! ProfileCollectionViewCell
但是我注意到当我使用之前使用的indexPath
时,我没有像以前那样回到同一个单元格,但是另一个单元格显然是随机顺序。我希望避免在没有必要时重新加载视频。
我有没有办法让相同的单元格使用相同的indexPath
?
谢谢, 卡洛斯
答案 0 :(得分:0)
您正在使用可重复使用的单元格。有了它,你无法确定你总是拥有相同的细胞,它几乎总是相反。您可以尝试在首次加载时存储单元格,然后在cellForRow中进行检查..但在我看来,更好的方法是将视频存储到文件中(当然有限制),因为存储单元格不是最佳选择
答案 1 :(得分:0)
您无法影响从dequeueReusableCellWithReuseIdentifier
返回的单元格实例。因此,当单元格在屏幕外滚动时,您无法将视频保留在单元格中。
您可以做的是将一个NSMutableDictionary属性添加到视图控制器并存储对其中视频的引用(使用单元格的indexPath作为键)。您可以存储引用
tableView(_:didEndDisplayingCell:forRowAtIndexPath:)
。
然后,当您从dequeueReusableCellWithReuseIdentifier
获取一个单元格时,您将从字典中检索到视频并将其添加到单元格中。这样,从队列中返回哪个单元格无关紧要。
答案 2 :(得分: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在下面的评论中提到的,如果你创建了很多单元格,这个解决方案会占用大量的内存。