tableView中的奇怪错误

时间:2011-10-18 01:36:14

标签: iphone objective-c ios uitableview

我有一个UITableView,我可以在这个表中添加和删除单元格。我也有两个按钮。 1个按钮为单元格的文本添加“1”,这是1,所以当按下按钮时按下+按钮和潜艇时基本上会计算。我的问题是最后一个细胞。如果我添加5个单元格,它就是第5个有问题的单元格。如果我添加200个单元格的第200个单元格,等等。问题是当我按下 - 按钮时,所有其他单元格在按下时都会变为蓝色,此按钮停止变为蓝色。当单元格文本为0时按下它时它会保持白色。我希望它在按下时像所有其他单元格一样保持变蓝。这是我的代码:

- (IBAction)subtractLabelText:(id)sender
{
    cell = (UITableViewCell*)[sender superview];    

    if ( [[cell.textLabel text] intValue] == 0){ 
        [newBtn setEnabled:NO];
    }
    else{
        cell.textLabel.text = [NSString stringWithFormat:@"%d",[cell.textLabel.text    
        intValue] -1];
        [newBtn setEnabled:YES];
    }
}

此方法连接到子“ - ”按钮。此外,当我在文本= 0时按下按钮时,按钮就在那里,但是当我按下它时,它会选择单元格,表格单元格变为蓝色,就像我选择了那样!请帮忙!谢谢大家!

cellForRow:

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

    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
        reuseIdentifier:CellIdentifier];
    } 
    cell.imageView.image = [imageArray objectAtIndex:indexPath.row];    
    cell.textLabel.text = [cells objectAtIndex:indexPath.row];

    newBtn = [[UIButton alloc]init];
    newBtn=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    [newBtn setFrame:CGRectMake(260,20,55,35)];
    [newBtn addTarget:self action:@selector(subtractLabelText:) 
        forControlEvents:UIControlEventTouchUpInside];
    [newBtn setTitle:@"-" forState:UIControlStateNormal];
    [newBtn setEnabled:YES];
    [cell addSubview:newBtn];

    subBtn = [[UIButton alloc]init];
    subBtn=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    [subBtn setFrame:CGRectMake(200,20,55,35)];
    [subBtn addTarget:self action:@selector(addLabelText:) 
        forControlEvents:UIControlEventTouchUpInside];
    [subBtn setTitle:@"+" forState:UIControlStateNormal];
    [subBtn setEnabled:YES];
    [cell addSubview:subBtn];
    return cell;
}

2 个答案:

答案 0 :(得分:0)

猜测一下,我会说它与UITableViewCell被重用的方式有关,因为用户界面“不知道”这些单元格上的子视图按钮。

尝试在-cellForRowAtIndexPath中注释掉可重复使用单元格的代码(因此,无论是否UITableViewCell,您实际上都会创建新的cell==nil

修改 您在newBtn中引用了-subtractLabelText,但这是一个不一定是指发送消息的按钮的ivar。请改为[sender setEnabled:NO]

答案 1 :(得分:0)

根据您的cellForRowAtIndexPath方法,您可以为每个单元格创建和添加新按钮,无论它们是被重用还是“全新”。

您的代码正在执行以下操作:

  1. 检查是否有要出列/重新使用的单元格
  2. 如果是,请抓住它的引用。如果不是,请创建一个新的。
  3. 将按钮XYZ添加到单元格(您的错误就在这里)
  4. 返回tableview的单元格以使用
  5. 想象一下,在第2步中,如果您重用现有单元格,此单元格已经添加了XYZ按钮,因此您实际上在不需要时添加了两个额外的按钮。

    您应该将设置单元格按钮的代码移动到if (cell == nil)循环内部,这样只有在初始化新单元格对象时才会创建按钮并将其添加到内容视图中。

    另外,请务必查看下面与您的问题没有直接关系但仍可能相关的其他评论。

    =============================================== ===================

    [编辑 - 上面的答案,但这也是相关的,所以我离开了这里]

    这不会解决您的问题,但您应该将按钮添加到单元格contentview而不是直接添加到单元格,即:

    [cell.contentView addSubView:buttonABC];
    

    完成后,您需要调用superview两次以在减法/加法方法中获取单元格引用:

    cell = (UITableViewCell*)[[sender superview] superview];    
    

    来自Apple关于UITableViewCell

    的文档
      

    UITableViewCell对象的内容视图是默认的superview   对于单元格显示的内容。如果要通过自定义单元格   只需添加其他视图,您就应该将它们添加到内容中   因此,当细胞过渡时,它们将被适当地定位   进出编辑模式。