2012-04-01 47 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函數。