UITableViewCell在选择时被覆盖?

时间:2009-04-09 19:11:57

标签: iphone objective-c

我有一个自定义UITableViewCell实现(利用标签作为子视图)正确呈现项目列表,但是当我向下滚动并选择一个项目(比如第43个数字为100)时,我看到了一个单元格的渲染从列表中的较早部分(例如,表格中第一个渲染页面上的数字3)出现在我选择的单元格的顶部。

这是我的方法:

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

    UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }
    // index of table view correlates to index of array
    Card *card = [cards objectAtIndex:indexPath.row];

    UILabel *cardNameLbl = [[[UILabel alloc] initWithFrame:CGRectMake(10.0, 3.0, 200.0, 18.0)] autorelease];
    cardNameLbl.tag = CARD_NAME_TAG;    
    cardNameLbl.text = card.name;
    cardNameLbl.font = [UIFont systemFontOfSize:12.0];
    cardNameLbl.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight;
    [cell.contentView addSubview:cardNameLbl];

    UILabel *cardNumLbl = [[[UILabel alloc] initWithFrame:CGRectMake(10.0, 21.0, 100.0, 18.0)] autorelease];    
    cardNumLbl.tag = CARD_NUM_TAG;
    cardNumLbl.text = card.number;
    cardNumLbl.font = [UIFont systemFontOfSize:12.0];
    cardNumLbl.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight; 
    [cell.contentView addSubview:cardNumLbl];

    UILabel *cardTypeLbl = [[[UILabel alloc] initWithFrame:CGRectMake(110.0, 21.0, 200.0, 18.0)] autorelease];  
    cardTypeLbl.tag = CARD_TYPE_TAG;
    cardTypeLbl.text = card.type;
    cardTypeLbl.font = [UIFont systemFontOfSize:12.0];
    cardTypeLbl.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight;    
    [cell.contentView addSubview:cardTypeLbl];

    UILabel *cardQuantityLbl = [[[UILabel alloc] initWithFrame:CGRectMake(250.0, 3.0, 50.0, 18.0)] autorelease];    
    cardQuantityLbl.tag = CARD_QUANTITY_TAG;
    cardQuantityLbl.text = [NSString stringWithFormat:@"%d", card.have];
    cardQuantityLbl.font = [UIFont systemFontOfSize:12.0];
    cardQuantityLbl.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight;
    [cell.contentView addSubview:cardQuantityLbl];

    return cell;
}

1 个答案:

答案 0 :(得分:5)

通常,这些类型的错误(从另一行看到数据)表示您没有设置可重用单元格的部分,所以它只是使用旧数据,但我找不到任何部分被重置。

然而你应该做的一件事,实际上可能解决这个问题,是子类UITableViewCell,它将这些标签维护为ivars。然后,您可以初始化标签并将其添加为子视图一次,在init方法中,或者您选择的任何其他位置。

目前正在发生的事情是:每次你抓住一个可重复使用的单元格时,它可能已经有了之前的那些标签,而你只是在子视图之上堆积了更多的子视图。 (除非我弄错了,并且可重复使用的单元格在返回之前清除了它的子视图。)