2015-09-20 3 views
0

У меня есть настроенный UITableViewCell с некоторыми атрибутами. Цель состоит в том, чтобы обновить каждую ячейку другим фоновым изображением (загружаемым из сети асинхронно). У меня есть десять ячеек, чтобы показать, но проблема в том, что нижние 5 ячеек всегда показывают первые пять загруженных изображений (которые загружаются для 5 лучших ячеек).UITableViewCell backgroundView изображение не загружается и показывает правильные изображения

Чтобы избежать загрузки изображений снова, когда ячейка перезагружается при прокрутке пользователя, я использую атрибут ячейки таблицы, называемый isImageLoaded. См. Фрагмент ниже. Попробовал несколько решений, чтобы исправить это безрезультатно. Я также показываю текстовые атрибуты для этих ячеек (не загружаются через HTTP-запросы), и они показывают правильные значения для всех 10 ячеек, прокручивающих вверх и вниз.

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell:ImageTableCell = self.tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as! ImageTableCell 

    cell.tag = indexPath.section 

    // cell.imageLoaded is initialized as false in the custom cell settings 
    if !(cell.imageLoaded) { 
     var photourl:String = "http://someurl/image" + String(indexPath.section) 
      downloadImage(cell, url: NSURL(string: photourl)!) 
     } 
    } 

func downloadImage(cell:HomeSummaryTableCell, url:NSURL){ 
     cell.activityindicator.startAnimating() 
     println("Started downloading \"\(url.lastPathComponent!.stringByDeletingPathExtension)\".") 
     getDataFromUrl(url) { data in 
      dispatch_async(dispatch_get_main_queue()) { 
       println("Finished downloading \"\(url.lastPathComponent!.stringByDeletingPathExtension)\".") 
       var imageView:UIImageView = UIImageView(image: UIImage(data: data!)) 
       imageView.contentMode = UIViewContentMode.ScaleAspectFill 
       imageView.clipsToBounds = true 
       cell.backgroundView = imageView 
       cell.activityindicator.stopAnimating() 
       cell.imageLoaded = true 
      } 
     } 
} 

func getDataFromUrl(urL:NSURL, completion: ((data: NSData?) -> Void)) { 
    NSURLSession.sharedSession().dataTaskWithURL(urL) { (data, response, error) in 
     completion(data: data) 
     }.resume() 
} 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 10 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 1 
} 

ответ

1

Это происходит потому, что dequed ячейка сохраняет значения заданных свойств, так что вам нужно сбросить параметр imageLoaded при подготовке к повторному использованию. В вашей пользовательской ячейке переопределите prepareForReuse и установите imageLoaded на номер false.

override func prepareForReuse() { 
     super.prepareForReuse() 

     imageLoaded = false 
    } 
+0

Работы (спасибо), но с накладными расходами на загрузку изображения и обновление ячейки. Это означает, что я должен правильно использовать логику imageLoaded, чтобы избежать повторной загрузки. Будет работать и обновлять, как это происходит. – sysuser

+0

Да, для этого вам нужно использовать кеширование изображений. Вы можете создавать свои собственные или искать cocoapods;) –

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