重复使用时如何完全清除单元格?

Posted

技术标签:

【中文标题】重复使用时如何完全清除单元格?【英文标题】:How do I clear a cell completely when I reuse it? 【发布时间】:2012-02-20 22:01:55 【问题描述】:

当我调用 [table reloaddata];

单元格用新数据重新绘制,但我的 UILabel 被弄乱了,因为它们是在旧的 UILabel 上绘制的,所以一团糟。

    static NSString* PlaceholderCellIdentifier = @"PlaceholderCell";

UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:PlaceholderCellIdentifier];


if (cell == nil)

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:PlaceholderCellIdentifier] autorelease];   
    cell.detailTextLabel.textAlignment = UITextAlignmentCenter;
    cell.selectionStyle = UITableViewCellSelectionStyleNone;


    cell.contentView.backgroundColor = [UIColor clearColor];

是我的单元格的初始化。

我像这样添加了一个 UILabel

        UILabel *theDateLabel = [[UILabel alloc] initWithFrame:CGRectMake(140, 35,140, 20)];
    [theDateLabel setBackgroundColor:[UIColor clearColor]];
    [theDateLabel setTextColor:[UIColor lightGrayColor]];
    [theDateLabel setText:[dateFormatter stringFromDate:theDate]];
    [theDateLabel setFont:[UIFont fontWithName:@"TrebuchetMS-Bold" size:15]];
    [cell addSubview:theDateLabel];
    [theDateLabel release];

单元格中还有几个标签,同样的事情。

我想要发生的是旧标签从单元格中消失,因此它们不再可见。

【问题讨论】:

【参考方案1】:

您不应将theDateLabel 添加为cell 的子视图。您应该将其添加为cell.contentView 的子视图。

正如 yuji 所建议的,实现这一点的一种方法是创建一个 UITableViewCell 的子类,并为每个自定义子视图创建一个属性。这样您就可以轻松地访问重复使用单元格的日期标签,以便为新行设置其文本。

另一种常见的方法是使用每个UIView 拥有的tag 属性。例如:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    static NSString* PlaceholderCellIdentifier = @"PlaceholderCell";
    static const int DateLabelTag = 1;

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:PlaceholderCellIdentifier];
    if (!cell) 
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:PlaceholderCellIdentifier] autorelease];   

        UILabel *theDateLabel = [[UILabel alloc] initWithFrame:CGRectMake(140, 35,140, 20)];
        theDateLabel.tag = DateLabelTag;
        theDateLabel.backgroundColor = [UIColor clearColor];
        theDateLabel.textColor = [UIColor lightGrayColor];
        theDateLabel.font = [UIFont fontWithName:@"TrebuchetMS-Bold" size:15];
        [cell.contentView addSubview:theDateLabel];
        [theDateLabel release];
    

    NSDate *theDate = [self dateForRowAtIndexPath:indexPath];
    UILabel *theDateLabel = [cell.contentView viewWithTag:DateLabelTag];
    theDateLabel.text = [dateFormatter stringFromDate:theDate];

    return cell;

【讨论】:

+1 用于直接和快速的解决方案。同样推荐 contentView 而不是 cell-view 本身是非常有价值的,因为它经常做错(在使用 tableView 编辑模式等时导致丑陋的效果)。【参考方案2】:

虽然 Richard 的解决方案可行,但如果您的单元格有任何其他子视图,它们也会被删除。此外,每次绘制单元格时分配和初始化子视图不一定是最佳的。

这里的标准解决方案是创建一个UITableViewCell 的子类,其属性为@dateLabel(其他标签依此类推)。然后,当你初始化一个单元格时,如果它没有@dateLabel,你可以给它一个新的,否则你只需要设置它的文本。

【讨论】:

以上是关于重复使用时如何完全清除单元格?的主要内容,如果未能解决你的问题,请参考以下文章

excel如何在修改单元格数据时清除指定的单元格数据

如何清除合并单元格的内容

生成新单元格时清除集合视图单元格(iOS7 - AFNetworking)

UITableView 重复单元格如何防止呢?迅速

excel 在下拉时,如何使单元格背景色不变?

滚动时如何使uitableview单元格不改变?