2016-11-20 28 views
4

我在上下滾動時遇到問題,然後我的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 
    } 

廈門國際銀行:

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 


      } 
     } 
    } 
} 
+1

你需要證明你的'cellForRowAtIndexPath' – Rajat

+0

@Rajat的代碼,請更新部分 –

回答

3

既然是可重複使用的電池,它的確是「重用」與舊圖像的單元格。然後,你需要的電池在cellForRowAtIndexPath顯示每一次更新:

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

感謝您的有價值的解決方案 –

+0

是最好的做法? –

+2

對於你的情況,你可以把這行放在configureCell方法中,因爲你從cellForRowAt中調用它。但一定要從cell.image = placeholder_image開始,這樣每個新的單元格都是用佔位符啓動的,然後下載圖像。然後,如果下載失敗,佔位符停留。 –

1

當電池被初始化

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 


    } 
可以在 ItemTableViewCell設置默認的圖像
+0

不能正常工作 –

+0

請檢查我的更新部分。這是我正確的方式嗎? –

+0

是的,它是正確的,這是什麼方法'setImageFromURL'是從任何庫嗎? – Rajat

1

您必須爲每個cellForRowAtIndexPath函數放置一個圖像,意思是在您的代碼中您需要編寫else條件的圖像操作,並且您需要放置佔位符圖像。由於tableview單元格在上下滾動時會被重複使用,因此如果不放置任何新內容,則會保留舊內容,這就是爲什麼它會顯示舊/重複內容。

+0

請分享代碼示例 –

+0

如果itemInfo包含需要從服務器下載則遠程URL, –

+0

如果IMG1 =零{ imageViewItemPic.image = IMG1 } 其他{ 打印( 「HI1」) imageViewItemPic.setImageFromURL!(網址:iteminfo.imageUrl) } –

0

就像我有同樣的問題;在閱讀之前。我嘗試了不同的方法,比如init和awakefromnib。在調用func來更新整個UI之前,只要您收到數據,就可以做到這一點。 (這就是爲什麼它會盡快從視圖控制器接收數據更新,即時通訊沒有調用func。如果它是一個從視圖控制器調用的函數,你只需要將佔位符圖像最初在func的開頭,然後下載新圖像並從視圖控制器調用它,例如cell.updateUI(data: data)

希望你們覺得這個很有用。對我來說,即時得到正確的圖像不顯示在單元複用:)

//的tableview控制器

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

設置爲imageViews的默認值是「無」我你的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 


} 
相關問題