在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:cellForRowAtIndexPathimageView填充一个虚拟的占位符图像 – 我不知道如何刷新新的图像,是由setNeedsDisplay做一个重绘? 但是,如果我不设置占位符图像,那么新的图像将不会显示。 我不知道可以使用什么机制来显示图像?

如果我使用

 [cell.imageView setNeedsDisplay] 

要么

 [cell setNeedsDisplay]; 

在完成块,它将无法正常工作,如果我使用

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

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

但有没有一种简单的方法来使图像显示出来? 设置一个占位符图像的作品,但如果我们不 – 通过什么机制的占位符导致图像刷新?

当调用UITableViewCell-layoutSubviews方法时,如果它的-layoutSubviewsimage属性nilimageView被赋予一个(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:相反。 他们的自述文件页面上的例子完全是你正在做的事情。