在iOS上,如何使cell.imageView刷新其内容?(On iOS, how to make

2019-06-27 15:08发布

我尝试在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 ,如果在哈希表,简单地使用它,所以不会有无限循环。

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

Answer 1:

UITableViewCell-layoutSubviews方法被调用时,如果它的imageViewimage属性是nilimageView被赋予的帧(0,0,0,0) 此外, -layoutSubviews仅是在某些情况下被调用:当电池即将成为可见的,当选择它。 不正常滚动过程中。 那么,你所看到的是里面设置占位符tableView:cellForRowAtIndexPath:大小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工作。 当然,这个解决方案将不考虑细胞再利用等等,但至少解决了为什么细胞的形象将不会出现:)

希望这可以帮助!



Answer 2:

这并不直接回答你的问题,但一个简单的workround您的问题是使用SDWebImage你cellForRowAtIndexPath:代替。 他们的自述页上的例子不正是你正在尝试做的。



文章来源: On iOS, how to make a cell.imageView refresh its content?