2015-11-04 69 views
3

我有一个CollectionView,我使用单元格来显示视频,并且我还在变量上存储了一些其他数据。每当我滚动我重复使用下面的代码之前碎片:UICollectionViewCells deque返回错误的单元格

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

但我注意到,当我使用我先前使用过的indexPath,我没有得到相同的细胞如以前,但另一个细胞显然在随机顺序。我想避免在没有必要时重新加载视频。

有没有办法让我用相同的indexPath使用同一个单元?

感谢, 卡洛斯

+1

可能重复的[UICollectionView - 图像随机设置](http://stackoverflow.com/questions/23013935/uicollectionview-image-is-getting-set-randomly) – casillas

回答

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所提到的,如果您创建大量单元格,此解决方案将使用大量内存。

+0

严重,这是非常烦人的,而虽然deque应该是卸载内存使用的,我们不得不在加载数组的时候加载它,并且当你的表一直在更新时会出现额外的问题,可能会减少单元的数量(所以这个例子不起作用) –

+0

这很大程度上取决于您计划在表格视图中加载多少行。代码将工作,但正如你提到它将使用更多的内存。它也可能会减慢第一卷的速度。但这一切都取决于你如何以及在哪里使用它。在列表中有10-20个视频的屏幕中,我严重怀疑您会遇到问题。如果我们正在说100行,那么可能... – Moriya

+0

在我的情况是稍有不同:我需要加载许多单元格(大约70-100),并根据条件突出显示某些单元格,但使用出列单元时突出显示错误始终..我真的很生气)) –

0

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

0

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

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

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