2012-07-19 81 views
1

首先,請不要告訴我這是重複的。我知道這個問題已經被多次詢問和回答,但即使在閱讀其他人的解決方案之後,我仍然無法讓我的代碼正常工作。UITableViewCell與UILabel子視圖緩存問題

我遇到了一個包含UILabel子視圖的UITableViewCell問題。 UILabel有時不會出現在某些單元格中,直到我從這些單元格滾動並返回給它們。下面是我使用自定義細胞代碼:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

UILabel *label; 

if (cell == nil) { 

    // cell is nil, create it 

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
            reuseIdentifier:CellIdentifier]; 


    label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 50, 33)]; 
    label.tag = 888; 

} else { 

    label = (UILabel*)[cell.contentView viewWithTag:888]; 
    [label removeFromSuperview]; 

} 

label.text = @"Label Text"; 
label.backgroundColor = [UIColor clearColor]; 
[label sizeToFit]; 
label.center = CGPointMake(cell.contentView.frame.size.width-label.frame.size.width/2-20, cell.contentView.frame.size.height/2); 
[cell.contentView addSubview:label]; 

// customize cell text label 
cell.textLabel.text = @"Cell Text"; 
cell.textLabel.textColor = [UIColor darkGrayColor]; 

return cell; 
} 

看來好像標籤正確地顯示出來時dequeueReusableCellWithIdentifier:CellIdentifier返回非零值,但不露面,如果返回值是零和一新單元必須實例化。

如果有人有一個想法,爲什麼這可能會發生,幫助將不勝感激。

+0

嗨,我不明白你爲什麼要創建新的標籤,並插入它們。基本的方法是在編輯器或代碼中準備一個單元格並重用它。雖然重用意味着乾淨和格式化,但不會重新排列甚至找到的單元格。所以對我來說,你似乎在浪費資源。我建議你在編輯板中準備一個自定義單元格,並將其分配給一個類並重用。或者您是否有重新安排標籤的具體原因? – iOS 2012-07-19 21:27:27

+0

我不知道我明白你在說什麼。我正在嘗試向表格單元格的最右側添加一個標籤(與單元格的textLabel屬性分開),並且標籤文本可能會在每次出現表格視圖時更改。 – stackunderflow 2012-07-19 22:12:13

回答

0

看來這個問題可能與修改cell.textLabel有關。本網站上的其他帖子建議,只要修改此標籤,實際上就會創建一個新標籤並將其添加到單元格的contentview中(與僅修改現有標籤相反)。設置cell.textLabel.backgroundColor = [UIColor clearColor];似乎已經解決了問題

我還是有點困惑,雖然因爲即使添加我的自定義標籤子視圖最後(設置屬性爲cell.textLabel後)沒有解決問題 - 的背景色cell.textLabel必須設置爲透明/清除。

1

我看到了一些你想做的事情。

1)閱讀「sizeToFit」 - 描述說,如果視圖沒有超視圖,你可能會得到奇怪的結果。

2)創建視圖時,立即將其添加到單元格中。 3)調整單元格大小後,獲取其大小,然後計算適當的框架 - 我建議不要使用「中心」,但我不知道你的代碼不適用於事實。

4)之前,甚至改變中心不斷變化的框架,硬代碼是這樣的:

CGRect r = label.frame; 
r.origin = (CGPoint){ 20, 20 }; 
label.frame = r; 

這將至少讓你相信新的細胞和舊細胞的正常工作。然後你可以計算你真正想要的框架,或者進一步玩中心。

0

不確定問題的原因,但您可以進行一些改進。也許他們中的一個修復該問題:

  1. 在dequeu情況下,您從視圖中刪除的標籤,只有重新添加。相反,您應該將其保留在視圖層次結構中。

  2. 爲了避免不得不一直調整大小和移動標籤。爲什麼不把它放到足夠寬的地方,將文本右對齊。這樣,您不必調整在出列情況下移動標籤的大小。

0

有三樣東西出來的地方:

if (cell == nil) { // cell is nil, create it 

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
            reuseIdentifier:CellIdentifier]; 

    label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 50, 33)]; 
    label.tag = 888; 
    [cell.contentView addSubview:label]; // (1) DO THIS HERE 

} else { 

    label = (UILabel*)[cell.contentView viewWithTag:888]; 
    // (2) DON'T DO THIS: [label removeFromSuperview]; 

} 

label.text = @"Label Text"; 
label.backgroundColor = [UIColor clearColor]; 
[label sizeToFit]; 
label.center = CGPointMake(cell.contentView.frame.size.width-label.frame.size.width/2-20, cell.contentView.frame.size.height/2); 
// (3) DON'T DO THIS HERE: [cell.contentView addSubview:label]; 
.... 

我認爲ARC是對的,否則你需要將它添加到內容查看後[標籤釋放。