我按照this wonderful tutorial学习iOS编程,除了我定位iOS 9并进行一些小修改。
在下面的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
}
答案 0 :(得分:2)
这部分没有意义:
if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) {
cellToUpdate.imageView?.image = image
这似乎在创造一个无限循环。每次拨打cellForRowAtIndexPath
都会导致对cellForRowAtIndexPath
的其他电话。
我想你的意思是:
cell.imageView?.image = image
你已经知道了这个细胞。您刚刚在调用此块之前创建了它。你不需要再查一次了。
答案 1 :(得分: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
(或模拟器?没有在真实设备上尝试过)的错误给我。
答案 2 :(得分: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
答案 3 :(得分: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
}
})
答案 4 :(得分:0)
Swift 5 设置图像后,只需将以下代码放入 cellForRowAt 委托方法中即可。
UIView.performWithoutAnimation {
tableView.beginUpdates()
tableView.endUpdates()
}
// Full Method
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "PhotoCell", for: indexPath) as? PhotoCell else { return UITableViewCell() }
let model = self.arrPhotos?[indexPath.row]
// Below method download image from url using asycn
SwiftHelper.downloadImageFrom(strUrl: model?.url ?? "") {[weak self] (img) in
guard let _ = self, let image = img else { return }
print("ImgDownloaded")
cell.imgView.image = image
// cell.layoutIfNeeded()
UIView.performWithoutAnimation {
tableView.beginUpdates()
tableView.endUpdates()
}
}
return cell
}
要对图像进行动画处理,可以删除performWithoutAnimation块。