collectionView.indexPathsForVisibleItems不会列出我知道可见的项目

时间:2017-01-06 15:09:14

标签: ios swift uicollectionview

我有一个UICollectionView,它显示的细胞部分是我需要从服务器获取的图像。在cellForItemAt中,我检查我的缓存以查看图像是否可用,如果没有,我会调用一种方法来下载图像。

在该方法中,我异步加载图像。下载图像时,我检查与该图像关联的indexPath是否可见。如果是这样,我调用reloadItems来更新显示。

问题是我可以在模拟器上看到空单元格,但在可见单元格数组中

这是一个显示问题的最小代码段。

   func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell: ThumbCell = collectionView.dequeueReusableCell(withReuseIdentifier: kReuseId, for: indexPath) as! PosterThumbCell


    print("cellforItemAt: \(indexPath)")
    print("visibleItems: \(collectionView.indexPathsForVisibleItems)")

    ...
    return cell
}

现在我希望indexPath位于可见项数组中。但事实并非如此。是否有一些事件必须在项目被认为可见之前发生?我错过了什么?

1 个答案:

答案 0 :(得分:0)

collectionView调用

collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell来获取它随后将显示的单元格。因此,如果在从此函数返回之前打印可见单元格,则新出列的单元格将不在数组中。

要对此进行测试,请添加测试按钮并将打印从此数据源函数移动到按钮的处理程序。单元格显示后点击按钮,它将在数组中。

我不知道你的下载方法是什么样的,但你的骨架应该是这样的:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell: ThumbCell = collectionView.dequeueReusableCell(withReuseIdentifier: kReuseId, for: indexPath) as! PosterThumbCell


    if let image = self.getImage(for: indexPath) {
        cell.image = image
    } else {
        weak var weakCell = cell
        self.loadImageFromServer(for: indexPath) { (image) in
            // Should check that the cell is still used for the same IndexPath
            weakCell?.image = image
        }    
    }
    return cell
}

分配图像(如果已下载),或者下载并在完成时分配。请注意,下载结束时,您在启动请求时使用的单元格可以重用于其他indexPath。有关详细信息,请查看此answer