2011-08-26 58 views
3

我有一個UITableView * myTableView的ivar。我有從互聯網加載數據,所以當數據被加載時,我應該調用[myTableView setNeedsDisplay],我知道我可以/應該調用[myTableView reloadData],但混淆的是調用setNeedsDisplay也應該工作,但不工作。關於UIView的setNeedsDisplay的困惑

我只是在尋找一個解釋什麼setNeedsDisplay呢?當在UITableView實例上調用時。

根據文檔setNeedsDisplay在「下一個繪製週期」中調用drawRect。所以任何人都可以告訴我下一個繪圖週期是什麼。

回答

5

setNeedsDisplay標誌着調用UIView,因爲需要重新繪製是一種純粹的視覺感,如上所述將發生在下一個繪圖週期。

這與在UITableView上下文中使用時重新加載數據完全不同。

有關該主題的更多信息,請參閱this article

6

setNeedsDisplay方法與重新加載tableView無關。它只是重繪tableViewview,而不是它的單元分隔符

setNeedsDisplay and reloadData完全是爲了不同的目的。

1

通常,您只需在已實施drawRect的自定義視圖上調用setNeedsDisplay。

1

SetNeedsDisplay

的一個很好的例子是,當一個的UIImageView與一個圖像渲染;當它仍然在屏幕上時,您將圖像更改爲其他內容。在這種情況下,只更改圖像並不總是會觸發對視圖的重新繪製,爲此,您需要撥打setNeedsDisplay

reloadData

它當底層數據源的實現代碼如下改變時被調用,您希望在UI.In被refelected這種情況下,調用此reloadData mehod

0

我解決方案是更新所有可見單元格並使用reloadRowsAtIndexPaths跟蹤我的自定義類「ProductTableViewCell」中單元格的indexPath,如下所示:

NSArray *arrayCells = [self.tableView visibleCells]; 
NSMutableArray *mArrayIndexPaths = [[NSMutableArray alloc] init]; 
for(ProductTableViewCell *cell in arrayCells) { 
    [mArrayIndexPaths addObject:cell.indexPath]; 
} 

[self.tableView beginUpdates]; 
[self.tableView endUpdates]; 
[self.tableView reloadRowsAtIndexPaths:[mArrayIndexPaths copy] withRowAnimation:UITableViewRowAnimationAutomatic]; 

這裏是如何定義類:

@interface ProductTableViewCell : UITableViewCell { 
    NSString *reuseID; 
} 

@property (nonatomic, strong) NSIndexPath *indexPath;