在iOS上,如何使cell.imageView刷新其内容?
我在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
,如果在哈希表中,只需使用它,所以不会有无限循环。
但有没有一种简单的方法来使图像显示出来? 设置一个占位符图像的作品,但如果我们不 – 通过什么机制的占位符导致图像刷新?
当调用UITableViewCell
的-layoutSubviews
方法时,如果它的-layoutSubviews
的image
属性nil
, imageView
被赋予一个(0,0,0,0)
的框架。 此外, -layoutSubviews
仅在某些情况下才会被调用:单元即将变为可见并被选中时。 不在正常的滚动。 所以你所看到的是在tableView:cellForRowAtIndexPath:
中设置占位符tableView:cellForRowAtIndexPath:
cell.imageView
大小cell.imageView
为非零大小,并且图像的后续改变将是可见的。
我通过在完成处理程序中调用[cell setNeedsLayout]
来解决问题,如下所示:
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:MY_IMAGE_URL]]; [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ UIImage *image = [UIImage imageWithData:data]; cell.imageView.image = image; [cell setNeedsLayout]; }];
我发现完成块发生在后台,所以需要在主线程上执行我的UI工作。 当然,这个解决scheme不会考虑细胞再利用等等,但至less可以解决为什么细胞的图像不会出现:)
希望这可以帮助!
这不会直接回答你的问题,但是你的问题的一个简单的解决方法是在你的cellForRowAtIndexPath:
使用SDWebImage cellForRowAtIndexPath:
相反。 他们的自述文件页面上的例子完全是你正在做的事情。