2011-06-06 74 views
0

我正在使用自定義的UITableViewCell。它們裝載得很好,但是當它們被重新使用而不是替換標籤中的文本時,它們是如何寫在其上面的。任何想法如何阻止這種行爲?UITableViewCell - 重用時在數據頂部顯示數據的視圖

我假設在重用之前我沒有正確重置視圖。我目前是空的標籤,所以他們只有一個空白的@「」字符串。但我仍然得到舊文本加上新的(非常混亂)。我確定有一個明顯的解決方案(目前我只是不重用該單元格,但這不是最佳實踐,並且在舊設備上很慢),所以如果有人可以幫助我會很感激。

感謝

ED

如這裏要求是修改小區

static NSString *CellIdentifier = @"Cell"; 
TransactionCellView *cell = (TransactionCellView *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if(cell == nil) { 
    [[NSBundle mainBundle] loadNibNamed:@"TransactionCellView" owner:self options:nil]; 
    cell = tblCell; 
} 

[cell resetCell]; // clears the labels 
[cell setData:[dataArray objectAtIndex:[indexPath row]]; // replaces the data and updates the labels 

return cell; 

}

+0

嘗試在tableView上使用reload()... – 2011-06-06 15:57:20

+0

您可以包含您的cellForRowAtIndexPath的代碼 – Dancreek 2011-06-06 16:22:40

+0

感謝您的答案,將在今天晚些時候嘗試其中一些並相應地進行更新。再次感謝 – Harold 2011-06-08 10:13:37

回答

2

解決了這個問題!令人驚訝的是,當你知道問題出在什麼地方時很簡單。

我正在使用IB和「清除圖形上下文」未在我的UILabels上選擇。所以這就是爲什麼下一個文本只是覆蓋舊的。

謝謝你們的幫助。

1

你是在細胞被重新使用正確的方法。您的代碼應大致使用以下模式設置:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString* identifier = @"someidentifier"; 
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 
    if(!cell) { 
     // create the cell and add all subviews to it 
    } else { 
     // update the cell and access appropriate subviews to modify what is displayed 
    } 
    return cell; 
} 

單元格將在首次使用標識符時創建。對於所有後續請求,該單元格將從UITableView緩存(通過dequeueReusableCellWithIdentifier)中提取出來,然後您可以通過標記,索引,類型或您選擇的任何機制訪問其子視圖。

有一點相關的是,您可以擁有多個單元標識符,這使您可以根據所擁有的數據創建不同單元的多個實例。在我的一個項目中,我有4個不同的單元,每個單元取決於它們將顯示的數據行數(1到4之間的任何位置)。這有助於確保平滑的滾動體驗,無論該單元格有多少行,因爲渲染器無需擔心動態更改單元格的高度。

+0

這基本上就是我所擁有的,但子視圖(標籤)並沒有取代他們的內容,而只是將其覆蓋在舊內容上。我試着先清空標籤文本屬性,但沒有區別。 – Harold 2011-06-09 09:30:19

+0

你如何添加子視圖?在重用它們時,如何獲取緩存單元格中子視圖的引用? – csano 2011-06-09 15:50:30

+0

我在IB中引用它們,並在setData時更改它們。這將數據對象解析爲單元格,單元格和單元格更新它的標籤。它還釋放舊數據。 – Harold 2011-06-10 09:18:33

1

我懷疑你是在你的cellForRowAtIndexPath方法中以編程方式添加標籤作爲子視圖。您需要確保每次單元回收時都不添加子視圖。相反,只有在創建新單元格時創建標籤(而不是在回收單元格時),然後爲標籤分配標籤值,然後在將其回收時,通過標籤值檢索標籤並更改其文本。

+0

不,我正在使用「接口」構建器並嘗試更新其中的標籤。但它只是覆蓋以前內容的內容。 – Harold 2011-06-09 09:28:47

1

試試這個..

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath { 

     for (UIView* subView in cell.contentView.subviews) 
     {  
      [subView removeFromSuperview]; 
     } 
     // Your Code to customize cell goes here. 
} 
+0

這基本上與不重複使用Cell相同,不是嗎?由於我不得不重新加載視圖?或筆尖在這種情況下更新屏幕上的單元格。除非我錯過了什麼? – Harold 2011-06-09 09:28:00

+0

每當一個單元格被繪製時,這段代碼將刪除他的子視圖。所以你可以再畫一遍。這將避免將視圖繪製在另一個視圖之上。試試這個,如果它不起作用,那就讓我知道。 – 2011-06-09 10:10:32

+0

如果我這樣做,它會使一切進行得非常緩慢,而且不重複使用這些單元並加載新單元會更快。舊設備上的速度仍然很慢,但速度不如每次刪除和重新加載視圖時慢。 – Harold 2011-06-10 09:19:53