我正在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
,如果在哈希表中,只需使用它,那么就不会有无限循环。
但是有一种简单的方法可以让图像显示出来吗?设置占位符图像有效,但如果我们不这样做 - 占位符导致图像刷新的机制是什么?
答案 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页面上的示例完全符合您的要求。