有重用UITableViewCell的问题

时间:2012-02-21 19:48:20

标签: iphone objective-c cocoa-touch

我有以下代码为UITableViewCell绘制分隔线和文本。它看起来很好,但当我滚动屏幕然后回来时,分隔线已经消失,但文本仍然很好。有什么想法吗?

  static NSString *aProgressIdentifier = @"CustomerCell";
                UITableViewCell *aCustomerCell = [iTableView dequeueReusableCellWithIdentifier:aProgressIdentifier];
                if (!aCustomerCell) {
                    aCustomerCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:aProgressIdentifier] autorelease];
                    aCustomerCell.contentView.backgroundColor = [UIColor whiteColor];
                    UIImageView *aLine = [[UIImageView alloc] initWithFrame:CGRectMake(0, 72, 800, 1)];
                    aLine.backgroundColor = [UIColor colorWithWhite:0.9 alpha:1.0];
                    [aCustomerCell addSubview:aLine];
                    [aLine release];
                }

                CMACustomer *aCustomerObject = aCellObject;
                aCustomerCell.textLabel.text = aCustomerObject.customerFullName;
                aCustomerCell.detailTextLabel.text = nil;     
                aCell = aCustomerCell;

3 个答案:

答案 0 :(得分:2)

尝试将“aLine”图像视图添加为contentView的子视图,而不是整个表本身。可能在重复使用单元格然后再次调用layoutSubviews时,contentView会重叠(白色背景)您的aLine。事实上,考虑到iOS默认单元格的子视图每次在屏幕上显示时都会动态重绘和调整大小。

所以我会试试这个:


[aCustomerCell.contentView addSubview:aLine];

如果这不起作用,你可以做的是完全删除contentView并添加你自己的自定义子视图(在if(!aCustomerCell)内部执行此操作,而不是在外部,除非你不能获得单元格的好处次使用):


 if (!aCustomerCell) {
    aCustomerCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:aProgressIdentifier] autorelease];
     [cell.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
     UIImageView *aLine = [[UIImageView alloc] initWithFrame:CGRectMake(0, 72, 800, 1)];
     aLine.backgroundColor = [UIColor colorWithWhite:0.9 alpha:1.0];
     [aCustomerCell.contentView addSubview:aLine];
     [aLine release]; 
}   

最后,另一项检查是验证单元高度是否> 72(这似乎是一个微不足道的检查,但它往往是令人头疼的问题!)。

答案 1 :(得分:1)

表视图使用的是单元格池,因此无法确定您为任何给定的索引路径获取哪个单元格。您可以使用单元格或内容视图,但请确保每个单元格只添加一个自定义行。

UIImageView *aLine = (UIImageView *)[cell viewWithTag:64];
if (!aLine) {
    // etc.
    UIImageView *aLine = [[UIImageView alloc] initWithFrame:CGRectMake(0, 72, 800, 1)];
    aLine.tag = 64;
    [cell addSubview:aLine];
    //
}
// other formatting logic here, you can also hide/show aLine based on biz logic

答案 2 :(得分:0)

尝试将其添加到contentView

[aCustomerCell.contentView addSubview:aLine]