具有重叠细胞的定制细胞

时间:2012-02-12 15:58:17

标签: iphone ios uitableview label

我使用方法cellForRowAtIndexPath绘制带有2个标签的单元格。当我重复使用一个单元格时,我之前在该单元格中的标签没有被擦除,所以我得到两个标签重叠,因为我正在重复使用一个单元格。这很奇怪,因为只有标签标题重叠,而另一个没有。

所以我要解决的问题是,我总是创造一个新细胞。这不合适,但解决了问题...任何人有类似的错误,并设法解决它?因为我刚刚做了一个解决方法......

//Desenhado por codigo
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell;
UILabel *label = nil;
UILabel *label2 = nil;    
UIColor *green = [UIColor colorWithRed:0 green: 0.77 blue:0 alpha:1];

cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
//    if (cell == nil)
{
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"Cell"] autorelease];

    //Descrição
    label = [[UILabel alloc] initWithFrame:CGRectZero];
    [label setLineBreakMode:UILineBreakModeWordWrap];
    [label setMinimumFontSize:FONT_SIZE];
    [label setNumberOfLines:0];
    [label setFont:[UIFont systemFontOfSize:FONT_SIZE]];
    [label setFont:[UIFont fontWithName:@"HelveticaNeue-CondensedBold" size:14.0]];        
    [label setTag:1];
    [label setTextColor:green];     
    [label setBackgroundColor:[UIColor clearColor]];      
    label.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"barra_cinza_lista.png"]];        
    [[cell contentView] addSubview:label];

    label2 = [[UILabel alloc] initWithFrame:CGRectZero];
    [label2 setLineBreakMode:UILineBreakModeWordWrap];
    [label2 setMinimumFontSize:FONT_SIZE];
    [label2 setNumberOfLines:0];
    [label2 setFont:[UIFont systemFontOfSize:FONT_SIZE]];
    [label2 setFont:[UIFont fontWithName:@"HelveticaNeue-CondensedBold" size:14.0]];        
    [label2 setTag:2];
    [label2 setTextColor:[UIColor whiteColor]];     
    [label2 setBackgroundColor:[UIColor clearColor]];

    [[cell contentView] addSubview:label2];  
}

NSString *text = [self getTableViewRow:tableView index:indexPath]; 

NSString *title = @"    %@";

if(tableView == myTableView1) 
    title = [NSString stringWithFormat:title, [_titlesResults objectAtIndex:indexPath.row]];
else 
    title = [NSString stringWithFormat:title, [_titlesVision objectAtIndex:indexPath.row]]; 

CGFloat widthMax = CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2);

CGSize constraint = CGSizeMake(widthMax, 20000.0f); //Tamanho máximo permitido de largura e altura
CGSize size1 = [title sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];     //Tamanho ocupado pelas letras
CGSize size2 = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];     //Tamanho ocupado pelas letras

if (!label)
    label = (UILabel*)[cell viewWithTag:1];

if (!label2)
    label2 = (UILabel*)[cell viewWithTag:2];    

[label setText:title];
[label setFrame:CGRectMake(0, 0, 320, MAX(size1.height, 44.0f))];    
[label2 setText:text];
[label2 setFrame:CGRectMake(CELL_CONTENT_MARGIN, 3 * CELL_CONTENT_MARGIN + size1.height, widthMax, MAX(size2.height, 44.0f))];    

return cell;
}

2 个答案:

答案 0 :(得分:0)

首先,取消注释这一行:

//    if (cell == nil)

如果你不这样做,你只是在每次滚动时创建和分配一个新单元格,而不会释放旧单元格......

答案 1 :(得分:0)

在方法的开头,枚举UIView中的所有[cell.contentView subviews]个对象并删除它们,如下所示:

for (UIView *subview in [cell.contentView subviews]) {
    [subview removeFromSuperview];
}

这是有效的,因为所有UI元素都从UIView继承,因此可以像删除它一样被删除。