簡體   English   中英

在UICollectionView中顯示錯誤的圖像

[英]Show wrong images in UICollectionView

那里! 我需要你的幫助。 我在UITableView里面的UICollectionView內部有UIImage。 當我第一次從API獲取數據時,它顯示正確的圖像,但是當我開始向下滾動並返回時,它顯示錯誤的圖像。 我的代碼如下所示:

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

    let post = allPostsOfUserArray[collectionView.tag]
    if post.imageLinks.count != 0 {
        let imageLink = post.imageLinks[indexPath.row]

        if imageLink.imageLink != nil {
            let url = URL(string: imageLink.imageLink!)

            cell.imageOfAnimalInCollectionView.sd_setImage(with: url!, placeholderImage: UIImage(named: "App-Default"),options: SDWebImageOptions(rawValue: 0), completed: { (image, error, cacheType, imageURL) in
            })
        }
    }

    return cell
}

我的模型如下所示:

class UserContent {

var name = ""
var imageLinks = [UserImages]()

init(name: String, imageLinks: [UserImages]?) {        
    self.name = name
    if imageLinks != nil {
        self.imageLinks = imageLinks!
    }
}

init() { }

deinit {
    imageLinks.removeAll()
  }
}


class UserImages {

var imageLink: String?

init(imageLink: String?) {
    self.imageLink = imageLink
}

init() { }

deinit {
    imageLink = ""
   }
 }

我在UITableView中做什么

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let index = indexPath.row

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! AllPostsOfUserTableViewCell

    cell.collectionView.tag = index

    let post = allPostsOfUserArray[index]
    if post.imageLinks.count == 0 {
        cell.collectionView.isHidden = true
    } else {
        cell.collectionView.isHidden = false
    }

    return cell
}

UPD:我將cell.collectionView.reloadData()添加到func tableView(cellForRowAt indexPath)。 現在工作正常。

cell.imageOfAnimalInCollectionView.image = nil
if post.imageLinks.count != 0 {
    let imageLink = post.imageLinks[indexPath.row]

    if imageLink.imageLink != nil {
        let url = URL(string: imageLink.imageLink!)

        cell.imageOfAnimalInCollectionView.sd_setImage(with: url!, placeholderImage: UIImage(named: "App-Default"),options: SDWebImageOptions(rawValue: 0), completed: { (image, error, cacheType, imageURL) in
        })
    }

}

(未經測試,但應該可以使用。您還可以使用sd_image的方法來分配一個空的url,並使用一個占位符圖像來僅顯示占位符圖像。或者只給出一個空的url字符串''而沒有占位符圖像)

每次滾動時,單元格都會重復使用,並且由於仍位於單元格上,因此會重新顯示分配給該單元格的圖像。 您可以通過使用去除這些圖像else條款為每個if你在哪里分配給ImageView的圖像。

希望這可以幫助。

您可以嘗試以下代碼:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! AllPostsOfUserCollectionViewCell
    cell.imageOfAnimalInCollectionView.image = UIImage(named: "App-Default")
    let post = allPostsOfUserArray[collectionView.tag]
    if post.imageLinks.count != 0 {
        let imageLink = post.imageLinks[indexPath.row]

        if imageLink.imageLink != nil {
            let url = URL(string: imageLink.imageLink!)

            cell.imageOfAnimalInCollectionView.sd_setImage(with: url!, placeholderImage: UIImage(named: "App-Default"),options: SDWebImageOptions(rawValue: 0), completed: { (image, error, cacheType, imageURL) in
            })
        }
    }

    return cell
}

這個問題有點像比賽條件。 您可以在類似問題中引用我的答案

您可能需要找到另一個模塊來下載圖像並手動設置為單元。

您必須編寫其他條件,例如“ ..

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

    let post = allPostsOfUserArray[collectionView.tag]
    if post.imageLinks.count != 0 {
        let imageLink = post.imageLinks[indexPath.row]

        if imageLink.imageLink != nil {
            let url = URL(string: imageLink.imageLink!)

            cell.imageOfAnimalInCollectionView.sd_setImage(with: url!, placeholderImage: UIImage(named: "App-Default"),options: SDWebImageOptions(rawValue: 0), completed: { (image, error, cacheType, imageURL) in
            })
        }
else{ 
      cell.imageOfAnimalInCollectionView = "defaultImage"
    }
 }
else{ 
     cell.imageOfAnimalInCollectionView = "defaultImage"
    }
    return cell
}

使單元cellectionView出隊后的原因會為所有下一個單元重用創建的單元,因此,如果您不編寫else條件或不使用prepareForReuse方法,它將始終prepareForReuse其緩存中的上一個單元的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM