当我重复使用它时,如何完全清除细胞?

时间:2012-02-20 22:01:56

标签: objective-c ios uitableview uikit

当我打电话给[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];

细胞中还有一些标签,同样的东西。

我希望发生的是旧标签从单元格中消失,以便它们不再可见。

2 个答案:

答案 0 :(得分:10)

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

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

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

- (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 :(得分:5)

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

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