可重复使用的细胞老图像显示

cri*_*ika 6 uitableview ios swift

我从上到下滚动时遇到问题,然后我的tableview可重复使用的单元格显示旧图像,直到新图像下载完成.

它应显示我的默认图像占位符,直到下载完成后下载新图像,然后将imageview从图像占位符更改为当前下载图像.我该怎么办 ?

抱歉英语不好.如果您需要任何信息,请告诉我们,谢谢

更新

TableViewcontroller:

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

       let cell = tableView.dequeueReusableCell(withIdentifier: "ItemTableViewCell") as! ItemTableViewCell
        let itemInfo = itemInfos[indexPath.row]


        var image1 : UIImage?
        var image2 : UIImage?

        if let imgUrl1 = itemInfo.imageUrl  {

             image1 = ItemListViewController.imageCache.object(forKey: imgUrl1 as AnyObject) as? UIImage


        }

      if let imgUrl2 = itemInfo.cookerProfilePicUrl{
         image2 = ItemListViewController.imageCache.object(forKey: imgUrl2 as AnyObject) as? UIImage
        }

        cell.configureCell(iteminfo: itemInfo, img1 : image1 ,img2 : image2)

        return  cell
    }
Run Code Online (Sandbox Code Playgroud)

厦门国际银行:

 func configureCell(iteminfo:ItemInfo , img1 : UIImage? , img2 : UIImage? ){

        if img1 != nil {
            imageViewItemPic.image = img1
        }
        else{
            print("hi1")
            imageViewItemPic.setImageFromURL(url: iteminfo.imageUrl!)
        }


        if img2 != nil {
            imageViewCookerProfilePic.image = img2

        }
        else{
            imageViewCookerProfilePic.setImageFromURL(url: iteminfo.cookerProfilePicUrl!)
        }

        labelItemHeading.text = iteminfo.heading
        labelItemDescription.text = iteminfo.description


    }
Run Code Online (Sandbox Code Playgroud)

更新:

 override func awakeFromNib() {
        super.awakeFromNib()
        self.imageViewItemPic.image = UIImage(named: "resto-placeholder.png")

    }
Run Code Online (Sandbox Code Playgroud)

更新:

extension UIImageView {

    func setImageFromURL(url: String) {

        DispatchQueue.global().async {

            let data = NSData.init(contentsOf: NSURL.init(string: url) as! URL)
            DispatchQueue.main.async {

                let image = UIImage.init(data: data as! Data)

                ItemListViewController.imageCache.setObject(image!, forKey: url as AnyObject)

                self.image = image


            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_* Dm 6

由于它是可重用的单元格,因此确实可以“重用”具有旧图像的单元格。然后,您需要在每次显示该单元格时对其进行更新cellForRowAtIndexPath

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        cell.image=placeholder_image
        //then download image
}
Run Code Online (Sandbox Code Playgroud)

  • 在您的情况下,您可以将此行放在configureCell方法中,因为您是从cellForRowAt调用它的。但是请确保从cell.image = placeholder_image开始,以便每个新的单元格都使用占位符启动,然后下载图像。然后,如果下载失败,则占位符将保留。 (2认同)