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 在下面的评论中提到的,如果您创建大量单元格,此解决方案将使用大量内存。
我有一个 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 在下面的评论中提到的,如果您创建大量单元格,此解决方案将使用大量内存。