首页 > 解决方案 > 在 UITable View Swift 中滚动时图片变得混合

问题描述

我的程序中有一个带有 dequeueReusableCells 的 UITable 视图我应该从服务器加载几个图像并在幻灯片中显示它们

我有一个自定义单元格,在配置每个单元格时,我在 DispatchQueue.global(qos: .userInitiated).async 和 DispatchQueue.main.async 中下载图像,我将下载的图片添加到幻灯片放映图像中

但是当我开始滚动一些不应该有任何图片的单元格时,有另一个单元格的重复图片

你知道是什么原因造成的吗?!

我在每个单元格中使用 swift 和 ImageSlideShow pod 进行幻灯片放映

这是我的代码的一些部分:

在我的新闻单元类中,我有以下部分用于获取图像:

class NewsCell: UITableViewCell{

    @IBOutlet weak var Images: ImageSlideshow!
    @IBOutlet weak var SubjectLbl: UILabel!
    @IBOutlet weak var NewsBodyLbl: UILabel!

    func configureCell(news: OneNews) {


        self.SubjectLbl.text = news.Subject
        self.NewsBodyLbl.text =  news.Content



        if news.ImagesId.count==0{
            self.Images.setImageInputs([ImageSource(image: UIImage(named: "ImagePlaceholderIcon")!)])
        } 
        else{
            for imgId in news.ImagesId {

                let Url = URL(string: "\(BASE_URL)\(NEWS_PATH)/\(imgId)/pictures")
                DispatchQueue.global(qos: .userInitiated).async {

                    let data = try? Data(contentsOf: Url!)

                    DispatchQueue.main.async {

                        if let d = data {
                            let img = UIImage(data: data!)!
                            imageSrc.append(ImageSource(image: img))
                            self.Images.setImageInputs(imageSrc);
                        }
                    }
                }
            }

        }
    self.Images.slideshowInterval = 3

}

这是 cellForRow 方法:

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

    let cell = generalNewsTableView.dequeueReusableCell(withIdentifier: "NewsCell" , for: indexPath) as!  NewsCell

    if let news = NewsInfo.sharedInstance.getGeneralNews(){
        cell.configureCell(news: news[indexPath.row])

    }
    return cell

}

getGeneralNews() 是一个 getter,它返回一个新闻数组,所以我在 cellForRowAt 中所做的是我在给定的索引路径中获取新闻并用它配置我的单元格。

class NewsInfo {

static var sharedInstance = NewsInfo()

private init(){}

private (set) var generalNews:[OneNews]!{
    didSet{
        NotificationCenter.default.post(name:
            NSNotification.Name(rawValue: "GeneralNewsIsSet"), object: nil)
    }
}
func setGeneralNews(allGeneralNews:[OneNews]){
    self.generalNews = allGeneralNews
}
func getGeneralNews() -> [OneNews]!{
    return self.generalNews
}
}

每个新闻都包含一个图片ID数组

这些是我的 OneNews 类 var Subject :String 中的字段!变量内容:字符串!var ImagesId:[整数]!

谢谢 !

标签: iosswiftuitableviewscrolluiimage

解决方案


UITableViewCell 在您滚动时被重用。当一个单元格离开屏幕顶部时,它将被重新用于出现在屏幕底部的另一行。

UITableViewCell 有一个prepareForReuse可以覆盖的方法。您可以使用该方法清除 iamgeViews 或任何其他应重置或取消图像下载的状态。

在您的情况下,您可能不应该使用Data(contentsOf:)它,因为它没有给您提供取消它的方法。URLSessionDataTask将是一个更好的选择,因为它可以让您在完成之前取消请求。


推荐阅读