2011-11-17 88 views
21

我得到了關於更新我的TableView一個棘手的問題,我得到使用更新它的不同的方法不同的結果,讓我解釋一下:的TableView reloadData與beginUpdates&endUpdates

情況1: 我用[tbl reloadData];其中tbl是我的TableView,更新TableView - 按預期工作。

情況2: 我使用:

[tbl beginUpdates]; 
[tbl reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationRight]; 
[tbl endUpdates]; 

哪裏tbl是我的TableView,和indexPaths是包含所有存在於所述的TableView indexPaths陣列。現在數組很好,它包含了所有正確的indexPaths(雙重和三重檢查),但出於某種原因 - 這不能按預期工作。

現在我意識到這是一個XY問題(我問Y的問題,但我的問題實際上是X,因爲我認爲解決Y將解決X),那只是因爲我覺得解釋X有點複雜說上面的問題)以一種簡單的方式,所以我寧願不要這樣做,如果可能的話。

因此,回到我的問題:更新TableView的兩種方式(當然除了動畫位)之間是否存在差異,或者我應該懷疑問題存在於其他位置?

編輯: 好吧,我會盡量解釋什麼症狀:

cellForRowAtIndexPath - 方法我添加一個按鈕,每個單元有分配的標籤等於細胞的indexPath行像這樣的:

btn.tag = indexPath.row; 

我之所以這樣做,這是這樣我就可以識別每個按鈕都調用相同的功能:

- (void)btnPressed:(id)sender 

當我然後更新單元格 - 因爲單元格中的某些值已更改 - 情況1使一切正常工作,情況2然而 - 混合標記,以便下一次按下其中一個按鈕時,它們不再具有正確的標籤。

混淆確實對我來說看起來是隨機的,但隨機發生的方式取決於我先按哪個單元格按鈕。我希望這能夠澄清我的問題。

+1

「我得到了不同的結果」,「這不符合預期。」以什麼方式? – TigerCoding

+0

那麼,每個單元格在創建時都會得到一個按鈕,並帶有一個標籤,其中'按鈕標籤=索引路徑行'。在情況1中,按鈕在情況2中獲得正確的標籤 - 它沒有。 –

回答

19

UITableView文檔

beginUpdates
開始一系列方法的調用插入,刪除或 選擇行和接收器的部分。

這意味着,除非您插入,刪除或選擇,否則不應使用此項。你沒有做這些。

此外,您應該結束beginUpdatesendUpdates而不是reloadData。文檔:

這組方法必須以endUpdates的調用結束。

+1

啊,是的'reloadData'位在我的文章中是一個錯字 - 我的不好。 –

+0

好的,這比reloadData和beginUpdates/endUpdates之間的區別得到了結論,但我真的不知道這些差別會如何影響我的結果。我意識到我在描述後果時有點模糊,我會在幾分鐘內更新我的原始問題。 –

+0

嘗試刪除'beginUpdates'和'endUpdates'。它們不屬於'updateRowsAtIndexPaths'。 – Mundi

3

reloadDatareloadRowsAtIndexPaths之間的第一個不同之處在於存在用於相同indexPath simulteaneosuly分配2個UITableViewCell對象做時reloadRowsAtIndexPaths(因爲tableview中「共混物」在新的小區)。有時候cellForRowAtIndexPath中的代碼沒有預見到這種情況。令人驚訝的是,即使已經爲特定的小區標識符分配了某個單元格,但在調用reloadRowsAtIndexPaths時,表格視圖並不會在dequeueReusableCellWithIdentifier中返回該單元格,而是返回nil 。相反,reloadData重用它已分配的單元格。

的第二個區別是,endUpdatesreloadRowsAtIndexPaths後直接調用cellForRowAtIndexPath(如果設置一個斷點,endUpdates在堆棧跟蹤中可見),而reloadData安排在稍後的時間調用cellForRowAtIndexPath(在堆棧跟蹤不可見) 。

但是,您需要發佈更多代碼才能讓我們瞭解您在那裏所做的工作。原則上,只要不刪除或插入行,新單元格的索引路徑也與reloadRowsAtIndexPaths中的舊單元格相同。

+0

謝謝你的回答Leo。這已經過去了幾年,我不記得這個項目發生了什麼,但是我懷疑我是否曾經解決過這個問題,希望這個Q和你和@Mundi給出的答案可以幫助其他有類似問題的人。 –

0

如果您希望後續插入,刪除和選擇操作(例如cellForRowAtIndexPath:和indexPathsForVisibleRows)同時進行動畫,請調用此方法。

我認爲這是你想要的。 beginUpdates & endUpdates可以用動畫改變UItableview。

相關問題