滚动时收藏夹视图可重用单元格问题

时间:2020-02-10 11:11:15

标签: ios iphone swift3 uicollectionview swift4

我正在使用集合视图在列表上显示gif。 现在在向上或向下滚动收集视图时面临单元可重用的问题。

itemA 一样位于列表的第一位置,而 itemB 则位于列表的第二位置。 但是当我在集合视图中滚动数据时。物品放错了地方。像某个时间项目A排在第五位,有时甚至在列表中的任何地方。 我知道我认为这是可重复使用的单元格的用途,但不知道该如何解决。 请帮助。

集合视图cellForItemAt

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "GifCell", for: indexPath as IndexPath) as? GifCell else {
        fatalError()
    }

    if gifArr.count > 0 {

        let urlString = self.gifArr[indexPath.row]
        let url = URL(string: urlString)!

        DispatchQueue.global().async {
            let imageData = try? Data(contentsOf: url)
            let imageData3 = FLAnimatedImage(animatedGIFData: imageData) // this is the 3rd pary library to show the gifs on UIimageview's
            DispatchQueue.main.async {
                cell.imageView.animatedImage = imageData3
                cell.textLabel.text = String(indexPath.row)
            }
        }
    }
    return cell
}

2 个答案:

答案 0 :(得分:1)

GifCell中,您可以实现prepareForReuse()方法:

进行必要的清理,以准备再次使用该视图。

override func prepareForReuse() {
    super.prepareForReuse()
    imageView.animatedImage = nil
    textLabel.text = ""
}

注意: 此时,每次调用cellForItemAt方法时,都会重新加载url,因此以后,您可能希望找到一种方法来缓存图像,而不是继续重新加载图像。

答案 1 :(得分:0)

第一个解决方案:您可以缓存数据,每次检查是否存在时,请使用缓存。 您可以使用this link,但可以用礼物类型替换UIImage

或 试试这个,我没有测试

if let giftAny = UserDefaults.standard.value(forKey: "giftUrl") {
  //cast giftAny to Data
  // use cached gift
} else {
  // cache gift
  let giftData = try? Data(contentsOf: url)
  UserDefaults.standard.setValue(giftData, forKeyPath: "giftUrl")
  //use gift
}

第二个解决方案:请勿重复使用单元格

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = UICollectionViewCell(style: .default, reuseIdentifier:"Cell")
        return cell
    }

但是在这种情况下,如果您有很多单元,则不可避免的是内存泄漏。