UICollectionViewCells deque返回错误的单元格

时间:2015-11-04 19:33:42

标签: ios swift uicollectionviewcell uicollectionreusableview

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

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

但是我注意到当我使用之前使用的indexPath时,我没有像以前那样回到同一个单元格,但是另一个单元格显然是随机顺序。我希望避免在没有必要时重新加载视频。

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

谢谢, 卡洛斯

3 个答案:

答案 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在下面的评论中提到的,如果你创建了很多单元格,这个解决方案会占用大量的内存。