我在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。这导致我的单元格一次又一次地显示加载指示符,即使该单元格和数据先前已加载。
答案 0 :(得分:0)
从数据源方法加载内容时,这是一个非常常见的问题。
这也是一种糟糕的方法,因为每次细胞进入画面时都会浪费带宽。
获得顺畅体验的最简单方法是缓存已下载的数据。
如果你想要一个非常强大的缓存逻辑,你可以查看在线缓存的解决方案,但我假设一个简单的<String: Data>
字典就足够了(其中String
是该特定单元格的标识符,而我我不是在谈论您在注册或取消单元格时使用的cellIdentifier
。您可以使用UUID
或hash
或其他最适合您的技术。
因此,在cellForItemAtIndexPath
中,您将检查该特定单元格的缓存中是否存在数据。如果是,那么从cahce(即Data
)获取它,否则从API获取。就这么简单。
答案 1 :(得分:0)
我应用了一个小技巧,但它确实有效。
我在自定义collectionview类
中放置了一个可选变量 indexPathvar 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
}