2012-02-16 61 views
4

首先抱歉,如果格式不正確,首次執行此操作。我一直在使用stackoverflow來查找很長一段時間的幫助,這非常有幫助(謝謝大家),但這是我第一次發佈自己的問題。這個問題已被多次詢問,但是當我調用[myTable reloadTable]時,調用numberOfSectionsInTableView和numberOfRowsInSection方法,但不調用cellForRowAtIndexPath。reloadData calls numberOfSections,numberOfRows,not cellForRowAtIndexPath

每一個答案,當搜索一直是一個變化我看到: 1)的tableView爲零 2)numberOfRowsInSection是0 3)的tableView的委託/數據源未設置 4)調用reloadTable在錯誤的UITableView 。

這些都不是我的情況,所以我想知道還有什麼可能是錯的。

我在做什麼: 我有一個自定義的uitableviewcell和一個按鈕,當按下按鈕時我想改變單元格的屬性(例如,讓我們只是說我想改變單元格標題爲「按下按鈕」)。然後我想暫停一下,然後刪除單元格。

不知道這是否重要,但我的tableView是在UIViewController中,而viewController是委託和數據源。

我有一個方法(下),當按下按鈕時會觸發,並且單元屬性根據需要進行更改,但是當我嘗試刷新表以顯示更改時,它不起作用。第一次調用[remTable reloadData]時,調用numberofsectionsintableview和numberofrowsinsection而不是cellforrowatindexpath。但是,第二次[remTable reloadData]被調用時,所有三個方法都被調用,並且所有的方法都能正常工作。

[email protected]"BUTTON PRESSED"; 
[remTable reloadData]; 
NSLog(@"sleep"); 
sleep(1); 
[remList removeObject:doneReminder]; 
[remTable reloadData]; 

爲了測試這一點,我把的NSLog語句在numberofsections,numberofrows和cellforrow開始時,輸出是方法,接着是編號的名稱(numberofsections/numberofrows)。

輸出:

numberofsections 1 
numberofrows 3 
sleep 
numberofsections 1 
numberofrows 2 
cellforrow 

任何想法,爲什麼cellforrow不是被稱爲第一次?在此先感謝,請讓我知道是否還有其他事情可以補充說明。

回答

8

表視圖實際上並不需要它的單元格,直到它需要顯示它們。當你打電話給reloadData時,它會立即請求部分和行的數量,以便知道它需要多大。在它被要求顯示自己之前,它並不要求細胞本身。視圖在每個運行循環的開始處根據需要自動顯示。

直到代碼返回,執行纔會返回到運行循環。當您撥打sleep時,您不會執行任何代碼,但您也不會返回。這意味着運行循環沒有機會顯示錶格,所以它從不要求任何單元格。你需要做的是從你的方法返回,並要求在1秒內調用另一個方法來刪除doneReminder。一個簡單的方法是使用performSelector:withObject:afterDelay:方法。此方法添加了一個計時器,該計時器將在給定延遲後調用您請求的方法,這意味着您可以返回到運行循環並讓表格顯示。

[email protected]"BUTTON PRESSED"; 
[remTable reloadData]; 
[self performSelector:@selector(removeDoneReminder) withObject:nil afterDelay:1.0]; 
- (void)removeDoneReminder { 
    [remList removeObject:doneReminder]; 
    [remTable reloadData]; 
} 

如果remlistremTable不是實例變量,你可以使用withObject:參數將它們發送到removeDoneReminder方法。

+0

我很確定這是正確的答案。 – 2012-02-16 03:36:41

+0

非常感謝你的詳細解釋,這正是發生了什麼,你的建議完美地解決了它。再次感謝您的及時,明確的迴應,不能要求更好的答案。 – jasonm 2012-02-16 03:43:51

0

的cellForRowAtIndexPath是UITableView的數據源協議的一部分,確保remtable.datasource被點到self

所以當你初始化的TableView,你應該添加

remtable.datasource = self; 

我總是這樣做,

remtable.delegate = self; 

希望得到這個幫助

0

嘗試使用延遲性能:

[remtable performSelector:@selector(reloadData) withObject:nil afterDelay:0.1]; 

不知道這是否會幫助,因爲我不知道你在做別的什麼。

+0

當我面臨tableView reloadData的問題時,添加延遲總是解決問題,但我不知道爲什麼。這是一個骯髒的解決方案 – 2012-04-10 20:53:20

+0

@Hisoka - 這可能是因爲你錯誤地編寫了你的​​數據源方法。你不知道他們什麼時候會被打電話,所以他們必須以任何時候提供正確答案的方式書寫。例如,他們可能會在視圖控制器有機會運行任何自己的代碼之前調用 - 所以數據還沒有準備好。 – matt 2012-04-11 20:46:09