2012-06-16 102 views
0

我有一個自定義的UITableViewCell,它似乎在我開始滾動之前在我的表格上多次出現。看來dequeueReusableCellWithIdentifier工作不正常。這裏是我的手機:多餘的UITableView單元格

MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    ... setup ... 
} 

當我打電話reloadRowsAtIndexPaths:在我的tableView,由於某種原因,它並沒有出列細胞,並將其重新創建新的。然後,當我再次滾動,然後再次滾動時,有時我的第一個單元出隊,有時第二個單元退出。 MyCustomCell基本上是一個文本字段,因此取決於哪一個出隊,文本每次都有不同的數據。

在我的自定義單元格中還有更多我應該做的事情嗎?提前致謝。

+0

我們可以看到您用來創建'CellIdentifier'變量的代碼嗎? –

+0

static NSString * CellIdentifier = @「ccCell」; – VTS12

+0

你的代碼似乎沒問題。您的UITableView大小正確嗎?也許你正在使用一個設置,使視圖認爲你有一個非常高的表。你沒有把UITableView放在UIScrollView裏面,對嗎?你使用的是什麼版本的iOS SDK?你不需要爲你的自定義類做任何事情。 –

回答

0

從您顯示的代碼看,您似乎只在創建新單元格時設置單元格的內容。由於無法知道您將從緩存中獲取哪個單元格,因此您需要配置該單元格是新的還是正在重新使用的單元格。

+0

正確。您在出列返回nil時創建新的單元格,但您必須將其配置爲顯示指定的行/動作,而不管是否重用或創建。 –

1

你在提問中提到reloadRowsAtIndexPaths:,但方法實際上是reloadRowsAtIndexPaths:withRowAnimation:。重新加載可以是動畫的事實。例如,要動畫UITableViewRowAnimationLeft,表格視圖需要在新單元格中滑動時滑出舊單元格。舊的和新的單元格同時在屏幕上顯示,因此表格視圖不能只爲兩者使用相同的UITableViewCell對象。這就是爲什麼「它不會將該單元出列並重新創建新單元」。它需要一個新的,因爲舊的仍然可見。

你需要確保當您收到tableView:cellForRowAtIndexPath:消息,你完全初始化細胞(是否出隊或新建)以顯示數據請求的行,並只請求行的數據。因爲(在動畫過程中)同一行可能有兩個單元格,所以您無法將自己的映射從行的indexPath保留到單元格。相反,如果您在任何時候需要獲取當前正在顯示某行數據的單元格,則需要通過向其發送cellForRowAtIndexPath:消息來詢問該單元格的表格視圖。

+0

@ rob mayoff我使用與動畫UITableViewRowAnimationNone相同的方法,即使它是第一次創建一個新的單元格。爲什麼不能像重裝方法那樣使用相同的可重用單元呢? –