2011-04-05 52 views
7

我有一個UITableViewController管理iPad應用程序中的UITableView對象。表格視圖與其他對象的相當複雜的星座相關聯。我有一個問題,當我要求它重新加載一行如下:UITableView的reloadRowsAtIndexPaths:(NSArray *)indexPaths無法重新加載,除非您調用它兩次?

//indexPath is an NSIndexPath with indexes 0 and 0. At the moment, this is the only cell in the table view. 
NSArray *array = [NSArray arrayWithObject:indexPath]; 
[self.tableView reloadRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationNone]; 

問題是行不重新加載。從來沒有回調cellForRowAtIndexPath。

瘋狂的事情是,如果我叫reloadRowsAtIndexPaths兩次,第二次通話不會觸發重裝:

//indexPath is an NSIndexPath with indexes 0 and 0. At the moment, this is the only cell in the table view. 
NSArray *array = [NSArray arrayWithObject:indexPath]; 
[self.tableView reloadRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationNone]; // does not reload 
[self.tableView reloadRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationNone]; // does reload 

我想知道是否有人曾經遇到過這樣的錯誤,如果是這樣,究竟是什麼原因?

+0

你在做一些後臺線程? – Daniel 2011-04-05 19:44:59

+0

有一個測試用例嗎? – 2011-04-06 22:01:15

+0

主線程。如果通過「測試案例」,你的意思是一個簡單的例子,說明同樣的事情,沒有我沒有,我希望我做到了。 – 2011-04-09 02:08:48

回答

6

reloadRowsAtIndexPaths:...只有當包裹其間的呼叫工作:

- (void)beginUpdates; 
- (void)endUpdates; 

之外的是,行爲是不確定的。 (正如你所發現的,相當不可靠)。

編輯:引用的相關部分「表視圖編程指南iPhone OS」:

要動態行和部分的一批插入和刪除,調用由定義動畫塊中插入和刪除方法連續調用beginUpdates和endUpdates。如果您不在此塊中調用插入和刪除方法,則行和部分索引可能無效。 beginUpdates ... endUpdates塊不可嵌套。

在塊結束時 - 也就是endUpdates返回後 - 表視圖查詢其數據源並像平常一樣查詢行和段數據。因此,應該更新支持表視圖的集合對象以反映新的或刪除的行或部分。

reloadSections:withRowAnimation:和reloadRowsAtIndexPaths:withRowAnimation:在iPhone OS 3.0中引入的方法與上面討論的方法有關。它們允許您請求表視圖重新加載特定部分和行的數據,而不是通過調用reloadData加載整個可見表視圖。

+0

你確定嗎?它沒有明確說在文檔中... – Daniel 2011-04-05 19:55:27

+1

這個問題去年殺了我一個星期......並且它確實說了,但它在表格視圖編程指南中隱藏**,而不是參考文檔。 – amattn 2011-04-05 19:57:21

+0

添加了來自蘋果文檔的相關部分。他們提到「與上面討論的方法有關」。這對於英語語言來說相當模糊,但實際上這意味着reloadRows只能在beginUpdates和endUpdates之間起作用。 – amattn 2011-04-05 20:06:39

2

我知道這個話題有點古怪,但我遇到了同樣的問題和簡單的修復。我有一個表視圖,當我調用reloadData和/或reloadRowsAtIndexPaths時,tableview方法cellForRowAtIndexPath不會觸發。

事實證明,我沒有在Interface Builder中連接我的tableview IBOutlet - 一旦這個連接被按預期觸發了一切。它總是這些小東西...

此外,像其他人所說的,如果您只需要一個調用,則將其封裝在begin/endUpdates中是沒有必要的。