UITableView将重复的标签添加到彼此之上

时间:2011-03-30 15:00:23

标签: iphone objective-c uitableview duplicates uilabel

当我向上和向下滚动时,我的UITableView会在彼此的顶部添加重复的标签。因此,最后添加了很多标签,添加速度会降低并崩溃。

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

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

    UILabel *label;
    label = [[UILabel alloc] initWithFrame:nameFrame];
    [label setText:[name objectAtIndex:indexPath.row + indexPath.section]];
    [label setFont:[UIFont fontWithName:@"Helvetica" size:18]];
    [label setBackgroundColor:[UIColor clearColor]];
    [cell addSubview:label];
    [label release];

    label = [[UILabel alloc] initWithFrame:statusFrame];
    [label setText:[status objectAtIndex:indexPath.row + indexPath.section]];
    [label setFont:[UIFont fontWithName:@"Helvetica" size:18]];
    [label setBackgroundColor:[UIColor clearColor]];
    [label setTextAlignment:(UITextAlignmentRight)];
    [cell addSubview:label];
    [label release];
    return cell;
}

3 个答案:

答案 0 :(得分:8)

您正在将可重复使用的单元格出列,因此UILabel已经存在于每个出列的单元格中。请尝试以下代码。

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

    UILabel *label;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        label = [[UILabel alloc] initWithFrame:nameFrame];
        label.tag = 1; //Important for finding this label
        [label setText:[name objectAtIndex:indexPath.row + indexPath.section]];
        [label setFont:[UIFont fontWithName:@"Helvetica" size:18]];
        [label setBackgroundColor:[UIColor clearColor]];
        [cell.contentView addSubview:label];
        [label release];

        label = [[UILabel alloc] initWithFrame:statusFrame];
        label.tag = 2; //Important for finding this label
        [label setText:[status objectAtIndex:indexPath.row + indexPath.section]];
        [label setFont:[UIFont fontWithName:@"Helvetica" size:18]];
        [label setBackgroundColor:[UIColor clearColor]];
        [label setTextAlignment:(UITextAlignmentRight)];
        [cell.contentView addSubview:label];
        [label release];
    }
    else
    {
        label = (UILabel*)[cell.contentView viewWithTag:1];
        label.text = [name objectAtIndex:indexPath.row + indexPath.section];

        label = (UILabel*)[cell.contentView viewWithTag:2];
        label.text = [status objectAtIndex:indexPath.row + indexPath.section];
    }

    return cell;
}

我确实调整了代码以使用单元格的contentView。

答案 1 :(得分:0)

您只需删除子视图:

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

这将完成工作“我有同样的问题”

答案 2 :(得分:0)

我解决这个问题的方式并不是很优雅但是很有效。

Joe提到的问题是我们通过将它们出列来重复使用单元格。这意味着有时我们使用已经具有其先前设置的属性的单元格,例如其textLabel。在我的情况下,这是由于细胞结构的差异。它将图像视图从一个单元格重叠在另一个单元格上,而不应该有一个图像。

我发现识别有问题的部分并在cellForRowAtIndex的开头将它们设置为nil解决了问题。这相当于在重复使用之前擦拭您的细胞板。

以下是我的编辑版本:

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

    UITableViewCell * cell = [self.tableView dequeueReusableCellWithIdentifier:bCellIdentifier];
    cell.imageView.image = Nil;
    cell.textLabel.text = Nil;
    _nameField.text = @"";

    ...

    // Setting the code with regards to the cells here

    ...

    return cell;
}

希望这有帮助