2015-11-05 71 views
0

我正在學習iOS編程this wonderful tutorial,除了我瞄準iOS 9並做了一些小的修改。iOS的UIImageView不會自動刷新

在下面的tableView()函數中,我可以下載縮略圖並調用處理程序,如從控制檯打印出兩條記錄行中可以看到的那樣。但是,當應用程序運行時(在模擬器中),我必須單擊每個表格單元才能顯示圖像。我試圖看看是否有refresh()或類似於UIImageView或表格單元中的內容,但什麼也沒找到。

如何在收到數據時立即顯示圖像?

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier(kCellIdentifier)! 
    let album = self.albums[indexPath.row] 

    // ... setting up other cell's data, see the tutorial link 

    // Start by setting the cell's image to a static file 
    // Without this, we will end up without an image view! 
    cell.imageView?.image = UIImage(named: "Blank52") 

    let request: NSURLRequest = NSURLRequest(URL: thumbnailURL) 
    let urlSession = NSURLSession.sharedSession() 
    urlSession.dataTaskWithRequest(request, completionHandler: {(data, response, error) -> Void in 
     print("received thumbnail \(thumbnailURLString)") // reached 
     if error == nil { 
      // Convert the downloaded data in to a UIImage object 
      let image = UIImage(data: data!) 
      // Update the cell 
      dispatch_async(dispatch_get_main_queue(), { 
       print("...dispatched thumbnail image for \(thumbnailURLString)") // reached 
       if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) { 
        cellToUpdate.imageView?.image = image 
       } 
      }) 
     } 
    }).resume() 

    return cell 
} 

回答

1

我想出了一個解決方法。如果我也更新文本輕微,圖像顯示正確的方式沒有點擊表格視圖單元格。

cellToUpdate.imageView?.image = image 
cellToUpdate.textLabel?.text = "\(album.title) " // a space is added to the end to make a difference and force the cell to be updated 

聽起來像UITableViewCell的錯誤(或模擬器?沒有嘗試過一個真正的設備上)給我。

+0

哇,謝謝。 – yeyo

+0

這不應該被接受的答案 – Rob

0

爲什麼你只是嘗試沒有dispatch_async(dispatch_get_main_queue())部分。

dispatch_async(dispatch_get_main_queue(), { 
      print("...dispatched thumbnail image for \(thumbnailURLString)") // reached 
      if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) { 
       cellToUpdate.imageView?.image = image 
      } 
     }) 

cell.imageView?.image = image 
+0

不,不會工作。 –

0

你可能需要當你試圖更新單元格鑄細胞。

dispatch_async(dispatch_get_main_queue(), { 
     print("...dispatched thumbnail image for \(thumbnailURLString)") // reached 
     if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) as! UITableViewCell { 
      cellToUpdate.imageView?.image = image 
    } 
}) 
2

這部分沒有任何意義:

if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) { 
    cellToUpdate.imageView?.image = image 

這似乎是創建一個無限循環。每次致電cellForRowAtIndexPath將導致另一致電cellForRowAtIndexPath

我覺得你剛纔的意思是:

cell.imageView?.image = image 

你已經知道的單元格。你在調用這個塊之前就創建了它。你不需要再看一遍。