UITableview单元格中的重复数据

时间:2014-01-14 11:45:51

标签: ios objective-c uitableview

当我在表格视图中向上和向下滚动时,每个单元格中的数据变得重复且不可读。有没有人对下面有任何建议?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     static NSString *CellIdentifier = @"Cell";
     NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
     [dateFormat setDateStyle:NSDateFormatterShortStyle];

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

     UILabel *label1 = [[UILabel alloc]initWithFrame:CGRectMake(10, 12, 250, 20)];
     UILabel *label2 = [[UILabel alloc]initWithFrame:CGRectMake(250, 12, 50, 20)];
     label1.tag= 666;
     label2.tag= 666;
     [cell.contentView addSubview:label1];
     [cell.contentView addSubview:label2];

     // Configure the cell...
     President *p = (President *)[self.importedRows objectAtIndex:indexPath.row];
     label1.text = p.no;
     label2.text = p.name;

     UILabel* cellLabel = (UILabel*)[cell viewWithTag: 666];
     cellLabel.text = [NSString stringWithFormat:p.no , p.name];


     return cell;
}

6 个答案:

答案 0 :(得分:3)

dequeueReusableCellWithIdentifier缓存生成的单元格。因此,如果您要求在此单元格之前创建的单元格不会从头开始再次生成(意味着您之前添加的标签已经存在!)。

因此,添加标签时会使用唯一编号对其进行标记:

label1.tag= 666;
label2.tag= 667;

在将它们添加到单元格之前,请按如下方式删除它们:

UIView *labelView = [cell.contentView viewForTag:666];
if (labelView != nil) {
    [labelView removeFromSuperView];
}

对第二个标签也这样做。

答案 1 :(得分:0)

因为您一次又一次地将label1和label2添加到单元格中。

UILabel *label1 = [[UILabel alloc]initWithFrame:CGRectMake(10, 12, 250, 20)];
UILabel *label2 = [[UILabel alloc]initWithFrame:CGRectMake(250, 12, 50, 20)];
[cell.contentView addSubview:label1];
[cell.contentView addSubview:label2];

当重复使用单元格时,相同的单元格用于另一行,并且它已经具有label1,2。但是你一次又一次地创建label1,2并将它们添加到它。

为label1,label2提供不同的标签。如果viewWithTag:666和667存在,请检查。如果不存在,请将它们添加为子视图,如果已存在,只需使用viewWithTag获取它们并更改其文本值。

答案 2 :(得分:0)

这里的问题是以下代码:

UILabel* cellLabel = (UILabel*)[cell viewWithTag: 666];
     cellLabel.text = [NSString stringWithFormat:p.no , p.name];

我已经尝试过你的代码,评论这两行不再重叠。您可以尝试更改此标签的框架。

答案 3 :(得分:0)

我建议创建你自己的UITableViewCell的子类,它上面有两个UILabel,然后在你上面使用的方法中,如果单元格不存在,则创建子类的实例而不是UITableViewCell,然后填充标签。 / p>

在自定义单元格实现文件中,您必须覆盖“prepareForReuse”方法,并在其中将标签文本设置为nil(@“”)。这恰当地使用了'dequeueWithReuseIdentifier'功能,只在必要时创建标签,而不是仅在需要时显示它们。

答案 4 :(得分:0)

您可以获得性能的解决方案如下。

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

    // create and add labels to the contentView
}

// retrieve and update the labels

显然你也可以创建你的UITableViewCell子类。

答案 5 :(得分:0)

你也可以试试这个赃物(新答案,得到你的新答案!):

BOOL doesContain = [cell.subviews containsObject:imageView]; 
if (!doesContain)
{
     [cell.contentView addSubview:imageView];
}
imageView.image = yourImage];

另外,为了快速将所有内容子类化,check my answer