Reusing an old image showing

I ran into a problem while scrolling from top to bottom of mine tableview. The reusable cell shows the old image until the new image is finished loading.

It should display the default placeholder for my image until a new image is uploaded, and after the upload is complete, change the imageView from the image placeholder to the currently loaded image. What should I do?

Refresh

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


    }

Update:

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

    }

Update:

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


            }
        }
    }
}
+5
source share
6 answers

, " " . , cellForRowAtIndexPath:

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

ItemTableViewCell,

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

Edit

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


    }
+1

cellForRowAtIndexPath, , else , . , , , - , , / .

+1

, ; . , init awakefromnib. - func .

, im, var restData didSet ( , view, im func. func viewcontroller, func viewcontroller, 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



    }

}
0

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

Set the default value for imageViews as "nil" in your xib file. This will prevent you from having an image in your cell before uploading it to a new one.

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


} 
0
source

Source: https://habr.com/ru/post/1661350/


All Articles