一种在 UITableViewCell 上清空 UIImageView 的方法
Posted
技术标签:
【中文标题】一种在 UITableViewCell 上清空 UIImageView 的方法【英文标题】:A way to empty a UIImageView on UITableViewCell 【发布时间】:2014-09-12 14:42:11 【问题描述】:我在UITableViewCell
上有一个UIImageView
当我没有要查看的图像时,我希望它消失。
我已经实现了这段代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
if ((item.content_image != nil) && (item.content_image != (id)[NSNull null]))
[cell.imageContentImage setImageWithURL:[NSURL item.content_image]] ;
else
cell.imageContentImage = nil;
我收到一位用户的报告,指出单元格中的图像有误(它似乎与其他单元格中的图像重复)。
问题是它不会发生在模拟器或我可以调试它的设备上,所以我的问题变成了理论:
将nil
分配给UIImageView
是正确的方法吗?有没有“更正确”的方法?
【问题讨论】:
贴出来的代码是用什么方法的? cellForRowAtIndexPath。编辑代码... 首先,我肯定会将 imageView 的图像设置为 nil 而不是 imageView 本身。如果您重复使用您的单元格,您可能会出现意外行为。 那么 nil out image 和 nil the entire UIImageView 有什么区别呢? 【参考方案1】:这里有几个问题。首先,当我认为您要查找的内容更像这样时,您正在对 NSNull
类型的对象进行指针比较:
if(item.content_image && ![item.content_image isEqual:[NSNull null]])
其次,您可能会看到重复图像的原因是因为您不是每次都分配一个新单元格,您是 dequeing
一个可重复使用的单元格,其中可能会留下旧的东西。最简单的方法是直接nil
立即取出图像视图的图像属性,然后仅在图像存在时分配图像。
cell.imageContentImage.image = nil;
if(item.content_image && ![item.content_image isEqual:[NSNull null]])
[cell.imageContentImage setImageWithURL:[NSURL urlWithString:item.content_image]];
【讨论】:
那么 nil out image 和 nil the entire UIImageView 有什么区别呢? 将 UIImageView 上的图像属性设置为nil
将删除图像,但不会破坏图像视图(或指向图像视图的指针,具体取决于它的创建方式)。这些单元格是可重复使用的,因此您要确保所做的任何事情都是非破坏性的,并且如果稍后将单元格从队列中拉出以获取不同的数据,则不会使单元格处于无效状态。【参考方案2】:
将 nil 分配给 UIImageView 的 UIImage 属性非常好。也许如果您在单元格中看到不正确的图像(重复的图像),它正在被缓存?确保不会发生这种情况的最安全方法是在 cellForRowAtIndexPath() 方法中将单元格出列时始终将单元格的图像设置为 nil 第一件事......然后在适当的情况下分配图像。获得“重复”的唯一方法是数据是否存在问题。
【讨论】:
【参考方案3】:在这种情况下,我认为您不想在 ELSE 块中编写代码。但是如果你想隐藏 UIImageView 这是一个更好的方法。
imageView.hidden = YES;
【讨论】:
以上是关于一种在 UITableViewCell 上清空 UIImageView 的方法的主要内容,如果未能解决你的问题,请参考以下文章