2012-05-01 51 views
2

在正常情況下有一個UITableView我有重新使用舊電池標準的代碼時:出隊UIViews withing的UITableViewCell

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:cellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
    } 
    return cell; 
} 

我注意到了,但是,在該情況下,當我添加子視圖的細胞,其他們沒有被刪除,並且每次都添加新的視圖。我有一個例子低於完美地展現它:

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:cellIdentifier]; 
    if (cell == nil) 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 

    UILabel *label = [[UILabel alloc] init]; 
    label.text = @"HELLO"; 
    label.frame = CGRectMake(arc4random() % 50, -1, 286, 45); 
    label.backgroundColor = [UIColor clearColor]; 

    // Add views 
    [cell addSubview:label]; 

    return cell; 
} 

我需要一些代碼,會再次重用我的標籤,以同樣的方式在細胞被重用。我該怎麼辦?

感謝

+1

只需在添加到單元格後發佈您的標籤。 – iMash

+0

刪除標籤或註釋if(cell == nil)條件行。因此它會分配每個新的單元格。它會針對性地解決您的問題,但對於大型表格存在內存管理問題。 –

回答

4

如果你正在一個新的細胞必須只添加子視圖。如果您正在出隊,子視圖已經存在,不應該重新創建。

你的方法應該是:

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:cellIdentifier]; 
    UILabel *label; 
    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
     label = [[UILabel alloc] init]; 
     label.tag = 1; 
     // Add views 
     [cell addSubview:label]; 
    } 
    else 
    { 
     // Label will already exist, get a pointer to it 
     label = [cell viewWithTag:1]; 
    } 

    // Now set properties on the subview that are unique to each cell 
    label.text = @"HELLO"; 
    label.frame = CGRectMake(arc4random() % 50, -1, 286, 45); 
    label.backgroundColor = [UIColor clearColor]; 

    return cell; 
} 

注意標籤是如何創建只有當細胞是零。否則,它是使用標籤找到的。

+0

謝謝,真的很有幫助。這是我以爲我需要處理它,但不知道如何編寫它。 –

0

可以在else部分使用類似的if(cell == nil)

for (UIView *sub in [cell.contentView subviews]) 
{ 
      if([UILabel class] == [sub class]) 
       NSLog(@"%@",[sub class]); 
       UILabel *label = (UILabel *)sub; 
       //do label coding ie set text etc. 
} 
0

我需要一些代碼,會再次重用我的標籤,以同樣的方式將細胞 被重用。

不,您需要更好地理解表格視圖設計。這應該是顯而易見的,爲什麼這些視圖被多次添加 - 重用一個單元格意味着您將不再需要以前的實例UITableViewCell(從而節省新對象的成本分配),並將此實例重新用於新單元格。但這個以前的例子已經貼上了標籤,所以標籤的數量會增加。

我會繼承UITableViewCell的子類,並將標籤創建放在這個新類的初始化代碼中。 (或者創建一個UIView子類,並將其設置爲單元的contentView,如nice table tutorial by Matt Gallagher中所建議的那樣)。這是封裝視圖細節並將其隱藏在表格數據源中的正確方法。

0

我在自定義表格單元格類中使用視圖的惰性初始化。 它只需要加載視圖和「addSubview」一次。

- (void) lazyInitTitleLabel { 
    if (_titleLabel != nil) { 
     return; 
    } 

    _titleLabel = [[UILabel alloc] initWithFrame: CGRectMake(10.0f, 10.0f, 200.0f, 30.0f)]; 
    // Cell adds the label as a subview... 
    [self addSubview: _titleLabel]; 
} 

你必須要小心的就是重置該視圖顯示像您的圖像視圖文本中您的標籤和圖像的任何內容的唯一的事情。如果您沒有舊的內容可能會與再循環的表格單元格一起使用。

祝你好運!