2015-02-25 4 views
1

Я использую SDWebImage, Я создаю эффект выполнения загрузки так же, как приложение WhatsApp.Изображения неправильно устанавливаются в cellForRowAtIndexPath в SDWebImage

Проблема заключается в том, что, когда я прокручиваю Tableview, Он показывает неправильные изображения для ячеек. (То есть: Когда клетки повторно случайные изображения устанавливают в клетках.)

Вот мой код в Swift:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    var cell:ImageCellTableViewCell = self.IBtblImageTable.dequeueReusableCellWithIdentifier("ImageCell", forIndexPath: indexPath) as ImageCellTableViewCell 
    var url:NSURL = NSURL(string: imageArray[indexPath.row])! 
    cell.tag = indexPath.row 
    manager?.downloadImageWithURL(url, options: SDWebImageOptions.ProgressiveDownload, progress: { (recievedSize:Int, expectedSize:Int) -> Void in 

     if(recievedSize>0){ 

      var progress:Float = 0 

      progress = Float(recievedSize)/Float(expectedSize) 

      println(CGFloat(progress)) 


     }else{} 

    }, completed: { (image:UIImage!, error:NSError!, cacheType:SDImageCacheType, finished:Bool, url:NSURL!) -> Void in 


     if ((image) != nil && cell.tag == indexPath.row) 
     { 
      dispatch_async(dispatch_get_main_queue(), {() -> Void in 
       cell.IBimgCellImage.image = image 
      }) 

     } 


    }) 

    return cell 
} 
+0

Вы сказали это сами - «когда ячейки повторно используются». –

ответ

2

Заявленный словарь:

var progressDic: [String:CGFloat] = [:] 

тогда

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

var cell:ImageCellTableViewCell = self.IBtblImageTable.dequeueReusableCellWithIdentifier("ImageCell", forIndexPath: indexPath) as ImageCellTableViewCell 
var url:NSURL = NSURL(string: imageArray[indexPath.row])! 
var progressCircle :CAShapeLayer? 
cell.IBimgCellImage.layer.sublayers = nil 
cell.IBimgCellImage.image = nil 

if(progressCircle == nil && progressDic[String(indexPath.row)] != 1.0){ 
    progressCircle = getProgressCircleLayer(cell.IBimgCellImage.center) 
    cell.IBimgCellImage.layer.addSublayer(progressCircle) 
    } 

manager?.downloadImageWithURL(url, options: SDWebImageOptions.ProgressiveDownload, progress: { (recievedSize:Int, expectedSize:Int) -> Void in 
    var progress:Float? 

    if(recievedSize>0){ 
     progress = Float(recievedSize)/Float(expectedSize) 
     self.progressDic.updateValue(CGFloat(progress!), forKey: String(indexPath.row)) 
      progressCircle?.strokeEnd = self.progressDic[String(indexPath.row)]! 


    }else{} 

}, completed: { (image:UIImage!, error:NSError!, cacheType:SDImageCacheType, finished:Bool, url:NSURL!) -> Void in 


    dispatch_async(dispatch_get_main_queue(), {() -> Void in 

       if (tableView.indexPathForCell(cell)?.row == indexPath.row) 
       { 
       cell.IBimgCellImage.image = image 
       } 
      }) 

    }) 

return cell 
} 

Вот и все.

Смежные вопросы