cellLabel.text的内容似乎在随机单元格中覆盖自身

时间:2010-09-11 00:40:27

标签: iphone objective-c uitableview ios

我有一个UITableView,它是从NSMutable数组中填充的,其中包含79个条目。当我运行我的应用程序并向下滚动表格时,一个单元格中似乎有多个条目。这似乎发生在屏幕高度和桌子下方的一半。

例如:

数组中的一个对象是@“Dog”,另一个是@“Cat”。在一个单元格中,您可以看到使用cellLabel文本写的Cat和Dog。

初始化单元格的代码

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    // Configure the cell...

    UILabel *cellLabel = [[[UILabel alloc] initWithFrame:cell.frame] autorelease];
    cellLabel.text = [symptomsArray objectAtIndex:indexPath.row];
    cellLabel.textColor = [UIColor blackColor];
    cellLabel.backgroundColor = [UIColor clearColor];
    cellLabel.opaque = NO;
    [cell.contentView addSubview:cellLabel];
    cell.contentView.backgroundColor = [UIColor colorWithRed:(214.0/255) green:(215.0/255.0) blue:(217.0/255) alpha:1.0];

    return cell;
}

5 个答案:

答案 0 :(得分:1)

这是因为您每次都要添加标签 如果你真的需要那个新的UiLabel然后将它添加到你所拥有的if语句中并从if

中更改它的文本

为了有效地做到这一点,你必须将UITableViewCell子类化为

希望这有帮助

答案 1 :(得分:1)

子视图相对于其超级视图的边界定位。因此,例如,如果您希望cellLabel位于内容视图的左上角,则需要将其原点设置为(0,0)。您正在使用单元格的框架,该框架相对于表格视图的左上角。

当您向下滚动时,UITableView正在重复使用旧单元格,并且您正在为这些单元格添加其他标签。这些单元格的框架的起源偏离表格视图顶部的一两个屏幕,因此您将新标签定位在单元格的实际边界之外。以下是修复方法。

static int CellLabelTag = 12345;

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    cell.accessoryType = UITableViewCellAccessoryTypeNone;

    UILabel *cellLabel = [[[UILabel alloc] initWithFrame:cell.contentView.bounds] autorelease];
    cellLabel.tag = 585493;
    [cell.contentView addSubview:CellLabelTag];
}

UILabel *cellLabel = (UILabel *)[cell viewWithTag:CellLabelTag];
cellLabel.text = // your text here
// blah blah blah configuration
return cell;

答案 2 :(得分:1)

保持简单。

如果您只有几个条目,为什么不在加载之前分配一个单元格数组,并直接从数组中加载单元格对象:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

 return [arrayOfCells objectAtIndex:indexPath.row]; //already allocated one single time at the beginning

    }

不再有dequeueReusableCellWithIdentifier ..

保持简单!

答案 3 :(得分:1)

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];
if (cell == nil) {
 cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease];
}

确保“dequeueReusableCellWithIdentifier”和“reuseIdentifier”应为“nil”

现在它会起作用!!

答案 4 :(得分:0)

亚力克答案是最好的答案,很多人都没有意识到这种情况正在发生,特别是如果他们没有使用ClearColor背景标签,在这种情况下你永远不会看到这种覆盖。

我首选的解决方案是使用您想要的属性创建自定义单元格。所以在这种情况下,你会创建

@interfacce MyCustomCell : UITableViewCell
    @property (nonatomic) UILabel *cellLabel;
@end

给它一个属性UILabel * cellLabel,除了在MyCustomCell.m的init中设置标签文本之外,执行上面的所有代码,用self替换任何单元格实例,例如:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

    if (self)
    {
        self.cellLabel = [[UILabel alloc] initWithFrame:cell.frame];
        self.cellLabel.textColor = [UIColor blackColor];
        self.cellLabel.backgroundColor = [UIColor clearColor];
        self.cellLabel.opaque = NO;
        [self..contentView addSubview:cellLabel];
        self.contentView.backgroundColor = [UIColor colorWithRed:(214.0/255) green:(215.0/255.0) blue:(217.0/255) alpha:1.0];
    }

    return self;
}

现在在你的cellForRowAtIndexPath中使用MyCustomCell,你检查cell == nil,你可能还要检查单元格标签:

if(cell == nil || cell.cellLabel == nil)

以完全相同的方式初始化它:

cell = [[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

现在,您需要做的就是设置:

cell.cellLabel.text = [symptomsArray objectAtIndex:indexPath.row];

你的cellForRowAtIndexPath中的代码更清晰,内存效率更高,并且你不会得到你的错误。

请记住在接口构建器中将您的单元格设置为MyCustomCell类型。