2013-05-08 84 views
1

我更新我UITableView用下面的代碼:UITableViewDataSource方法沒有得到所謂的

int index = [self.guests indexOfObject:_guests]; 

[[self tableView] beginUpdates]; 
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:index inSection:0]] withRowAnimation:UITableViewRowAnimationLeft]; 
[[self tableView] endUpdates]; 

但調用[[self tableView] endUpdates],它不是調用其數據源的方法之後。在添加行的情況下,它會調用它的數據源方法。我認爲在刪除的情況下,它不需要向其數據源請求任何東西,但是在添加一行的情況下,它需要詢問它的數據源幾乎所有有關添加像cellForRow,高度等等的新行的一切。我只是想確保它是正確的,如果deleteRowsAtIndexPaths不調用它的任何數據源方法?

+0

你是否有所有的細胞可以在同一時間嗎? – 2013-05-08 10:03:45

+0

你需要調用'[tableView reloadData];'endUpdates – 2013-05-08 10:07:44

+0

after no reloadata,tableView不會調用它的委託方法?@AhmedZ。 – 2013-05-08 10:12:46

回答

2

deleteRowsAtIndexPaths:indexPaths並不要求在所有情況下委託方法。它只是簡單地刪除行,如果被刪除的行很多以至於佔用了屏幕區域,那麼它可能會調用你的委託方法。您必須顯式調用reloadData,以便刷新其行。

但調用reloadData立即會破壞你的動畫或產生奇怪的錯誤,因爲它的行被刪除,並調用重載方法。 (它可能會發瘋)。備用解決方案是像0.2以上這樣的稍微延遲之後調用reloadData

[self.tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationLeft]; 
[self.tableView performSelector:@selector(reloadData) withObject:nil afterDelay:0.2]; //calling reloadData after a short delay. 0.2 or whatever suits you. 

不要忘記從你的數據源的陣列或任何你正在使用保存數據刪除的數據。

+0

在我的情況下,被刪除的行在屏幕中是可見的..我可以看到它被動畫刪除,但它不調用它的委託或數據源方法。在我的項目中出現錯誤,或者那是tableview刪除的方式。因爲它確實有道理,tableview並不需要在刪除的情況下調用它的數據源方法,只是想確定我是否可以在某處找到它。 – 2013-05-08 10:25:07

+1

不,沒有錯。它的正確行爲。 [Here's](http://stackoverflow.com/a/861250/593709)另一篇相關文章。 – 2013-05-08 11:03:33

+0

不是一個更好的解決方案在同一'beginUpdates'塊內調用'reloadRowsAtIndexPaths:'作爲刪除而不是混淆延遲因子等嗎? – jszumski 2013-05-08 12:50:20

0

答案是一個問題「它爲什麼要叫所有的數據源和委託方法如果視圖已經popuated和所有細胞都是現成的」? 好吧應該是行爲

相關問題