在iOS上,如何让cell.imageView刷新其内容?

时间:2012-08-31 05:29:33

标签: iphone ios uitableview sendasynchronousrequest

我正在tableView:cellForRowAtIndexPath尝试通过调用

来设置图像
[self downloadImage:urlString andSetIntoCellImageView:cell]

并在downloadImage中,它将调用NSURLConnection:sendAsynchronousRequest(仅限iOS 5及更高版本),并在完成块中,使用

设置图像
cell.imageView.image = [UIImage imageWithData:data];   // data is downloaded data

并且如果在tableView:cellForRowAtIndexPath中,imageView填充了虚拟占位符图像,则可以正常工作 - 我想知道新图像是如何刷新的,是setNeedsDisplay来执行重绘?但是,如果我没有设置占位符图像,那么新图像将根本不显示。我想知道可以使用什么机制来显示图像?

如果我使用

[cell.imageView setNeedsDisplay]

[cell setNeedsDisplay];

在完成块中,它将无效,如果我使用

[self.table reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
                            withRowAnimation:UITableViewRowAnimationAutomatic];

在完成功能块中downloadImage接受indexPath,它会再次调用tableView:cellForRowAtIndexPath,并导致无限循环。所以我似乎需要使用一些哈希表来记住图像是否已经在哈希表中:如果没有,请调用downloadImage,如果在哈希表中,只需使用它,那么就不会有无限循环。

但是有一种简单的方法可以让图像显示出来吗?设置占位符图像有效,但如果我们不这样做 - 占位符导致图像刷新的机制是什么?

2 个答案:

答案 0 :(得分:14)

当调用UITableViewCell的{​​{1}}方法时,如果其-layoutSubviews的{​​{1}}属性为imageView,则会给出image nil的框架。此外,仅在某些情况下调用imageView:当单元格即将变为可见时以及何时被选中。不是在正常滚动期间。因此,您看到的是将(0,0,0,0)尺寸-layoutSubviews内的占位符设置为非零尺寸,然后可以看到图像的后续更改。

我通过在完成处理程序中调用tableView:cellForRowAtIndexPath:来修复此问题,如下所示:

cell.imageView

我发现完成块在后台发生,因此需要在主线程上执行我的UI工作。当然这个解决方案不会考虑细胞再利用等等,但至少解决了细胞图像不会出现的原因:)

希望这有帮助!

答案 1 :(得分:0)

这不会直接回答您的问题,但解决您问题的一个简单方法是在cellForRowAtIndexPath:中使用SDWebImage。他们的README页面上的示例完全符合您的要求。