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

从上到下滚动时,我面临一个问题,然后我的tableview可重用单元格显示旧图像,直到新的图像下载完成。

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

对不起,英语不好。 如果您需要任何信息,请通知我

更新

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 } 

厦门国际银行:

  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 } 

更新:

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

更新:

 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 } } } } 

由于它是一个可重复使用的单元格,它确实“重复使用”旧单元格。 然后,每次在cellForRowAtIndexPath显示单元格时,都需要更新它:

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

您必须为每个cellForRowAtIndexPath函数放置一个图像,这意味着在您的代码中您需要编写else条件来执行图像操作,并且需要放置一个占位符图像。 由于tableview单元格在上下滚动时会被重复使用,因此如果不放置任何新的内容,它将保留旧的内容,这就是为什么它显示旧的/重复的内容。

初始化单元格时,可以在ItemTableViewCell设置默认图像

 override func awakeFromNib() { super.awakeFromNib() // Initialization code self.image= defaultImage } 

编辑

 func configureCell(iteminfo:ItemInfo , img1 : UIImage? , img2 : UIImage? ){ if img1 != nil { imageViewItemPic.image = img1 } else{ print("hi1") imageViewItemPic.image = UIImage(named: "resto-placeholder.png") imageViewItemPic.setImageFromURL(url: iteminfo.imageUrl!) } if img2 != nil { imageViewCookerProfilePic.image = img2 } else{ imageViewItemPic.image = UIImage(named: "resto-placeholder.png") imageViewCookerProfilePic.setImageFromURL(url: iteminfo.cookerProfilePicUrl!) } labelItemHeading.text = iteminfo.heading labelItemDescription.text = iteminfo.description } 

就像我有同样的问题; 在阅读之前。 我尝试了不同的方式,如init和awakefromnib。 在调用func来更新整个UI之前,只要您收到数据,就可以做到这一点。

另外,请注意使用var restDatadidSet (这就是为什么它会立即从viewcontroller接收数据更新,即时通讯不调用func。如果这是一个func从didSet调用,你只需把占位符图像初始在下载新图像之前在func的开头,并从诸如cell.updateUI(data: data)调用它,

希望你们觉得这个有用。 对我来说,即时获得正确的图像,而不显示单元格重用的预览图像:)

//桌面控制器

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell : RestCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! RestCell //configure the cell to item cell.restData = items[indexPath.row] return cell } 

// UITableviewCell

  class RestCell: UITableViewCell { @IBOutlet var img : UIImageView! @IBOutlet var lbl : UILabel! // get data and update. var restData: RestsModel! { didSet { // default img early placeholder set. Eliminates showing old pic in cell reuse self.img.image = UIImage(named: "60x60placeholder.png") // Update all values func updateUI() } } override func awakeFromNib() { super.awakeFromNib() // Default image placeholder //self.img.image = UIImage(named: "60x60placeholder.png") } // required init. required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder)! // Color of selected. let myCustomSelectionColorView = UIView() myCustomSelectionColorView.backgroundColor = UIColor(red: 234.0/255.0, green: 46.0/255.0, blue: 73.0/255.0, alpha: 0.1) //UIColor(netHex:0xFFFF434) selectedBackgroundView = myCustomSelectionColorView } // updateUI func. fileprivate func updateUI() { // download the image if ( self.restData.image != nil && self.restData.image != "") { ImageLoader.sharedLoader.imageForUrl(urlString:self.restData.image, completionHandler:{(image: UIImage?, url: String) in self.img.contentMode = UIViewContentMode.scaleAspectFit self.img.image = image }) } else { self.img.image = UIImage(named: "60x60placeholder.png") } self.lbl.text = restData.name as String } } 

它很简单,不写很多代码只有两行解决你的问题

  cell.thumbnailimage.image = nil cell.thumbnailimage.setImageWith(imageurl!) 

在xib文件中将imageView的默认值设置为“nil”。 这将确保您的单元格中没有图像,然后再加载新的图像。

 func configureCell(iteminfo:ItemInfo , img1 : UIImage? , img2 : UIImage? ){ //Set the imageViews to nil to make sure no other picture are set imageViewItemPic.image = nil imageViewCookerProfilePic.image = nil //Check if img1 is not nil if img1 != nil { imageViewItemPic.image = img1 } else{ print("hi1") imageViewItemPic.setImageFromURL(url: iteminfo.imageUrl!) } //Check if img2 is not nil if img2 != nil { imageViewCookerProfilePic.image = img2 } else{ imageViewCookerProfilePic.setImageFromURL(url: iteminfo.cookerProfilePicUrl!) } labelItemHeading.text = iteminfo.heading labelItemDescription.text = iteminfo.description }