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

时间:2016-11-20 14:35:18

标签: ios swift uitableview

我从上到下滚动时遇到问题,然后我的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
    }

XIB:

 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


            }
        }
    }
}

6 个答案:

答案 0 :(得分:4)

由于它是一个可重复使用的单元,它确实会重复使用"旧图像的单元格。然后,每次在cellForRowAtIndexPath

中显示单元格时,您都需要更新它
 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        cell.image=placeholder_image
        //then download image
}

答案 1 :(得分:1)

您可以在初始化单元格时在var touchtime = 0; $('.download-img').on('click', function() { if(touchtime == 0) { //set first click touchtime = new Date().getTime(); } else { //compare first click to this click and see if they occurred within double click threshold if(((new Date().getTime())-touchtime) < 800) { //double click occurred alert("double clicked"); touchtime = 0; } else { //not a double click so set as a new first click touchtime = new Date().getTime(); } } }); 中设置默认图像

ItemTableViewCell

修改

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

正如我遇到同样的问题;在读这个之前。我尝试了不同的方法,如init和awakefromnib。在调用func更新整个UI之前,只要您收到数据就可以了。

另外,请注意我使用var restDatadidSet(这就是为什么一旦从viewcontroller接收数据就会更新,我不会调用func。如果它是一个func来自viewcontroller您最初将占位符图像放在func的开头,然后再下载新图像并从视图控制器(例如cell.updateUI(data: data)

)调用它

希望你们觉得这很有用。对我来说,我得到正确的图像,而没有在单元重用上显示预览图像:)

// tableview controller

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



    }

}

答案 4 :(得分:0)

非常简单不会写很多代码只有两行解决你的问题

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

答案 5 :(得分:0)

将imageViews的默认值设置为&#34; nil&#34;在你的xib文件中。这样可以确保在加载新单元格之前不要在单元格上放置图像。

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


}