在UICollectionView中显示错误的图像

时间:2017-07-24 14:03:11

标签: ios swift uitableview uicollectionview

有!我需要你的帮助。我在UICollectionView里面有UIImage,它位于UITableView中。当我第一次从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)。现在它工作正常。

4 个答案:

答案 0 :(得分:0)

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方法分配一个空网址,并使用占位符图片显示占位符图片。或者只是给一个空的网址字符串没有占位符图片的''

无论何时滚动,都会重新使用单元格,并且分配给单元格的图像会再次出现,因为它仍在单元格上。 您必须为要为imageView指定图像的每个else使用if子句删除这些图像。

希望这有帮助。

答案 1 :(得分:0)

你可以尝试这段代码:

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
}

答案 2 :(得分:0)

这个问题就像竞争条件。 您可以在similair question

中引用我的回答

您可能需要找到另一个模块来下载图像并手动设置为单元格。

答案 3 :(得分:0)

您还必须编写其他条件,例如“下..

”。
    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方法,它将始终保留其高速缓存中的前一个单元的数据。