当我在表格视图中向上和向下滚动时,每个单元格中的数据变得重复且不可读。有没有人对下面有任何建议?
- (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;
}
答案 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。