UITableView单元有时无法更新图像,但滚动后显示正常

时间:2012-04-01 15:56:47

标签: ios uitableview

为了排除显而易见的,我正在从主线程更新UI,我已经阅读了一堆类似的问题。可悲的是,他们都没有帮助。

简而言之:应用程序尝试从其本地缓存中获取当前单元格的图像。如果失败,则启动后台线程以下载映像,然后从主线程更新UI。这有效率的90%。如果没有,则单元格中的imageView保持为空。有趣的是,这总是发生在相同的图像上。

但是,一旦单元格滚出视图然后返回视图,图像就会更新。

立即显示的图像与不显示的图像之间似乎没有显着差异。

我也尝试用setNeedsDisplay更新单元格,但这也不起作用。什么工作,但除了有点笨拙之外,我的动画混乱是[tableView reloadData]

// tableView:cellForRowAtIndexPath: 
if(!pic) {
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // download image, add it to the cache etc.
    dispatch_async(dispatch_get_main_queue(), ^{
        // check if cell is visible
        if ([[tableView visibleCells] containsObject: theCell]) {
          [[theCell imageView] setImage:pict];
          [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:idxp] withRowAnimation:UITableViewRowAnimationAutomatic];
        }
     });
  });
}

4 个答案:

答案 0 :(得分:1)

遇到我将图像下载到UITableViewCell子类中的问题,但是在将单元格滚动到屏幕之前,图像有时无法正确缩放(或甚至不渲染)。

编辑:重新阅读问题并看到原始海报已经尝试过setNeedsDisplay,所以在这种情况下这可能无济于事。我会把这个答案留给那些偶然发现这个的人

告诉单元格的imageView重新布局做了诀窍:

- (void)imageDidDownload:(UIImage *)image // Note: custom delegate callback
{
    [self.imageView setImage:image];
    [self.imageView setNeedsLayout];
}

答案 1 :(得分:1)

我有同样的问题。这是因为我直接更新图像。例如,[cell.image setImage:imageName];但我认为正确的方法是你需要一个图像数组,更新图像数组。然后调用UITableView的reloaddata函数。

答案 2 :(得分:0)

是的,问题就在我身边。

确切原因是一些非常奇怪的日期比较代码。更确切地说,此代码未能使用正确的索引调用reloadRowsAtIndexPaths:,因为两个单元格具有相同的日期,这导致一个单元格更新两次,并且一个单元格根本没有更新。我不是指问题中提供的代码。

我对遇到同样问题的其他人的建议是仔细检查代码中更新的部分并在表视图中创建单元格。

答案 3 :(得分:-1)

我也看到图像视图中的setImage不会按预期更新,我和其他人使用的解决方案是分配UIImageView本身。