2012-04-01 67 views
3

只是为了排除显而易见的问题,我正在从主线程更新UI,并且我已经阅读了一堆类似的问题。可悲的是,他们都没有帮助。UITableView单元有时无法更新图像,但滚动后显示正常

简而言之:应用程序会尝试从当地缓存中获取当前单元格的图像。如果失败,它会启动后台线程来下载图像,然后从主线程更新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]; 
     } 
    }); 
    }); 
} 
+0

在调用'reloadRowsAtIndexPaths:'的地方,任何机会'idxp'与'indexPathForCell:theCell'都不相同? – 2012-04-01 16:03:29

+0

没有。它们是相同的。而'[setCellSetDisplayDisplay]'也不起作用。 – dandan78 2012-04-01 17:01:55

回答

0

是的,问题出在我身上。

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

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

-1

我也看到如预期中的图像认为setImage不会得到更新,我和其他人使用是指定的UIImageView自身的解决方案。

+0

你的意思是:'theCell.imageView = [[UIImageView alloc] initWithImage:pict];'? – dandan78 2012-04-01 17:03:50

+0

因为'theCell.imageView'是只读的,所以不能分配给'ImageView'。 – dandan78 2012-04-04 18:26:20

1

在我将图像下载到UITableViewCell子类中时出现问题,但图像有时无法正确缩放(甚至无法呈现),直到单元格从屏幕滚动出来为止。

编辑:只要重新读这个问题,看到原来的海报已经尝试setNeedsDisplay,所以这可能不会在这种情况下帮助。我会离开这个答案谁比谁过这个虽然

告诉细胞的ImageView的到重新布局没诀窍绊:

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

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