我使用dequeueReusableCellWithIdentifier
和afnetworking+uiimageview
的表格。我的一些细胞有图像,有些没有。如果我在加载图像之前滚动我的表,成功块会将图像放入重用的错误单元格中。例如,图像在单元格#2中,但是在滚动之后它出现在单元格编号#8中,因为#8在那个时刻处于第二位置。是否可以将setImageWithURLRequest
与dequeueReusableCellWithIdentifier
一起使用?
我的代码:
let cell = tableView.dequeueReusableCellWithIdentifier("simpleCell", forIndexPath: indexPath) as UITableViewCell!
cell.textLabel.text = fields[indexPath.row]["name"] as String
cell.imageView.image = nil
if let image = fields[indexPath.row]["image"] as? String {
if (image != "") {
let image_url = NSURL(string: image)
let url_request = NSURLRequest(URL: image_url)
let placeholder = UIImage(named: "no_photo")
cell.imageView.setImageWithURLRequest(url_request, placeholderImage: placeholder, success: { [weak cell] (request:NSURLRequest!,response:NSHTTPURLResponse!, image:UIImage!) -> Void in
if let cell_for_image = cell {
cell_for_image.imageView.image = image
cell_for_image.setNeedsLayout()
}
}, failure: { [weak cell]
(request:NSURLRequest!,response:NSHTTPURLResponse!, error:NSError!) -> Void in
if let cell_for_image = cell {
cell_for_image.imageView.image = nil
cell_for_image.setNeedsLayout()
}
})
}
}
return cell
抱歉,如果我的问题与另一个问题重复。我发现了很多类似的问题,但我还没有找到解决方案。我试图添加重装
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None)
进入我的成功区块,但没有帮助。
更新: 我也注意到,当我的所有细胞都有图像时,我没有这个问题。如果我理解正确的原因是:当尝试请求新图像时,AFNetworking正在中止对同一单元格的先前请求。但如果我没有在单元格中成像,它就不会中止。我该如何手动完成?
答案 0 :(得分:4)
当表格视图重复使用单元格时,图像下载仍在后台处理。完成后,cell
指向具有不同内容的重用单元格。
您有两种选择:
cancelImageRequestOperation
cell.imageView.image = nil
cell
;而是使用您的数据模型从表视图中请求正确的单元格。答案 1 :(得分:0)
检查单元格是否可见
let visibleCells = tableView.visibleCells as NSArray
cell.imageView.setImageWithURLRequest(url_request, placeholderImage: placeholder, success: { [weak cell] (request:NSURLRequest!,response:NSHTTPURLResponse!, image:UIImage!) -> Void in
if let cell_for_image = cell {
if(visibleCells.containsObject(cell)) {
cell_for_image.imageView.image = image
cell_for_image.setNeedsLayout()
}
}
}, failure: { [weak cell]
(request:NSURLRequest!,response:NSHTTPURLResponse!, error:NSError!) -> Void in
if let cell_for_image = cell {
cell_for_image.imageView.image = nil
cell_for_image.setNeedsLayout()
}
})