UITableViewCell和图像重叠

时间:2010-09-16 14:33:47

标签: iphone objective-c uitableview

我的UITableView有一个奇怪的问题...我为每个单元格添加了一个UIButton作为子视图,但是当任何单元格看不见时会发生一些事情,当我滚动时再次,我可以看到一些细胞的UIButton背景图像重叠!

我使用的cellForRowAtIndexPath方法包含以下代码,其中添加了UIButton个实例

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"];

    if (cell == nil)
    {

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
                                      reuseIdentifier:@"MyCell"];

        [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];

        UIFont *titleFont = [UIFont fontWithName:@"Arial-BoldMT" size:14.0];
        [[cell textLabel] setFont:titleFont];

        [cell autorelease];


    }

    if([cell viewWithTag:indexPath.row]==nil){ 
    UIButton *buttonLeft = [UIButton buttonWithType:UIButtonTypeCustom];
    buttonLeft.tag=indexPath.row;
    if ([[myArray objectAtIndex:indexPath.row] isEqualToString:@"item1"]) {

        [buttonLeft addTarget:self action:@selector(doThat:) forControlEvents:UIControlEventTouchUpInside];
        [buttonLeft setBackgroundImage:[UIImage imageNamed:@"item1.png"] forState:UIControlStateNormal];    
        [buttonLeft setFrame: CGRectMake( 5.0f, 6.2f, 30.0f, 30.0f)];


    }else{

        [buttonLeft addTarget:self action:@selector(doThat:) forControlEvents:UIControlEventTouchUpInside];
        [buttonLeft setBackgroundImage:[UIImage imageNamed:@"item2.png"] forState:UIControlStateNormal];    
        [buttonLeft setFrame: CGRectMake( 5.0f, 6.2f, 30.0f, 30.0f)];

    }
[cell addSubview:buttonLeft];
    }


    cell.textLabel.text=[NSString stringWithFormat:@"         %@",[myArray objectAtIndex:indexPath.row]];
    return cell;
}

显然,出于某种原因,此代码会在每次显示单元格时添加UIButton。我希望每个按钮子视图只添加一次.. 我做错了什么?

非常感谢您的帮助

1 个答案:

答案 0 :(得分:4)

这是因为表视图出于性能原因重用单元格。因此,正确实现的cellForRowAtIndexPath:方法会返回已存在的单元格,如果没有可重用的单元格,则只会创建一个新单元格。

将所有与按钮相关的代码放在if (cell == nil) {}中,以便该按钮仅添加到“新鲜”单元格中,它应该可以正常工作!