2009-07-23 76 views
3

這是我第一次嘗試iPhone開發,我有一些UITableViewController將顯示從web服務返回的數據。在[tableview reloadData]之前重新加載UITableViewController的模型

在我的AppDelegate中,我設置了一個計時器,每隔幾秒鐘調用一次並重新加載模型。我保留相同的對象引用,只是刷新它的內容,所以我在目前可見的任何UITableViewController上都有相同的對象。

當數據在AppDelegate中刷新,我呼籲:

[[(UITableViewController *)[self.navigationController topViewController] tableView] reloadData]; 

的模式基本上file對象的集合。每個file對象都有一些屬性和標誌。

如果當前的UITableViewController是一個簡單的表,其中一個部分將每個單元映射到files的Array上的順序索引,則此方法運行良好。

但我有一個UITableViewController s顯示此file的細節,根據file對象上的標誌,將顯示2或3個部分。我在這裏把這個邏輯:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    if ([[_file status] intValue] & DOWNLOADING) { 
     kIndexTransferSpeed = 1; 
     kIndexSettings = 2; 
     return 3; 
    } else { 
     kIndexSettings = 1; 
     kIndexTransferSpeed = -1; 
     return 2; 
    } 
} 

所以這個控制器上,我-tableView:cellForRowAtIndexPath:只是一個大if語句,將顯示來自_file對象的屬性,取決於indexPath

這種方法的問題是,當該表在設備上重新加載時,我實際上可以看到它正在重新加載。章節標題閃爍片刻,單元格稍微顯示出來。特別是如果我在重新加載時滾動表格。

我讀過的地方,我應該保持自己不要把這些UITableViewController方法的任何邏輯。但我該怎麼辦?

我曾考慮過創建一個「數據視圖模型」的具體方法,該數據已準備好供- tableView:cellForRowAtIndexPath:使用,並且在調用它的[tableView reloadData]之前由AppDelegate調用。但是,每次調用它時,我都必須重新創建這個「視圖模型」,因爲它是同一個對象,我不知道數據模型中發生了什麼變化。

回答

6

reloadData必須處理很多事情,包括來來往往的部分,以相對順序移動的對象等。在不知道實際正在發生的事情的情況下,有時沒有任何事情可以做,但基本上是拆卸和重建表格。

如果您想避免這種情況,您可以通知控制器發生的具體更改。基本上,而不是你的視圖通過控制器中的dataSource重新加載所有的數據,控制器特別告訴它什麼是更新和如何。

它比只調用reload有更多的工作,但它更高效,使用更少的功率,並且由於UI具有更好的信息,它不僅避免整個事件消失並重新出現,而且實際上可以在變化中進行動畫處理。

你想看看的方法是:

- (void)beginUpdates; // allow multiple insert/delete of rows and sections to be animated simultaneously. Nestable 
- (void)endUpdates;  // only call insert/delete/reload calls inside an update block. otherwise things like row count, etc. may be invalid. 

- (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; 
- (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; 
- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; 

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; 
- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; 
- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; 

更多的文檔,請here

+0

謝謝!因此,在-viewWillAppear上:我可以創建一個「視圖模型」NSMutableArray,當AppDelegate刷新數據時,我可以創建一個更改列表並在我的控制器上調用-refreshModel,該控制器處理適當的動畫,重新顯示選定的行。那是對的嗎? – leolobato 2009-07-23 15:37:53

相關問題