UICollectionView保留单元格视图

时间:2018-04-05 13:26:40

标签: ios swift uicollectionview

我在UICollectionView单元格中有一个webview。如果屏幕上的单元格已加载,如果我向下滚动新单元格会被加载,但是如果我再次滚动到顶部,则先前加载了WebView的第一个单元格将从开始时再次加载webview。有没有办法管理这种情况,以便最终用户不会一次又一次地在同一位置看到webview。

PS我正在将本地数据加载到webview中,但由于它包含图表和大量渲染,因此加载单元格需要几秒钟。

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

        cell.loadHTMLData()
           return  cell
    }

如果iI向下滚动然后再向上滚动,则会多次调用indexpath 0的cellForItemAtIndexPath。这导致我的单元格一次又一次地显示加载指示符,即使该单元格和数据先前已加载。

2 个答案:

答案 0 :(得分:0)

从数据源方法加载内容时,这是一个非常常见的问题。

这也是一种糟糕的方法,因为每次细胞进入画面时都会浪费带宽。

获得顺畅体验的最简单方法是缓存已下载的数据。

如果你想要一个非常强大的缓存逻辑,你可以查看在线缓存的解决方案,但我假设一个简单的<String: Data>字典就足够了(其中String是该特定单元格的标识符,而我我不是在谈论您在注册或取消单元格时使用的cellIdentifier。您可以使用UUIDhash或其他最适合您的技术。

因此,在cellForItemAtIndexPath中,您将检查该特定单元格的缓存中是否存在数据。如果是,那么从cahce(即Data)获取它,否则从API获取。就这么简单。

答案 1 :(得分:0)

我应用了一个小技巧,但它确实有效。

我在自定义collectionview类

中放置了一个可选变量 indexPath
var indexPath : IndexPath?

然后在cellForItemAtIndexPath方法中,我检查了cell.indexPath是否为null并且与cellForItemAtIndexPath方法的值相同。如果它是相同的,我将直接返回单元格而不再重新加载HTML。

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

    if let cellIndexPath = cell.indexPath {
        if cellIndexPath == indexPath {
            return cell // This is the cell with preloaded HTML so return it directly 
        }
    }

    cell.indexPath = indexPath
    cell.loadHTMLData()
       return  cell
}