1

在我的应用程序中,我面临一个非常奇怪的问题。我试图解决它几个小时,但到目前为止找不到问题所在。

好吧,我有一个带有自定义单元格的表格视图。每个单元格都有一个按钮。它就像一个空盒子。按下按钮时,我想更改该按钮的相关单元格图像。实际上我成功地做到了,但不知何故,其他一些单元格的按钮图像也在改变,我不知道为什么。这是我的代码:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"cell";
        CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil)
        {
            //create new cell
            cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }
        [cell.tickButton setTag:indexPath.row];
        [cell.tickButton addTarget:self action:@selector(buttonWasPressed:)forControlEvents:UIControlEventTouchUpInside];

//cell has 2 label so I filled them with the contents of my object array that part is working with no problem
        cell.leftLabel.text = [NSString stringWithFormat:@"%@", [[contacts objectAtIndex:indexPath.row]name]];
        cell.rightLabel.text = [NSString stringWithFormat:@"%@", [[contacts objectAtIndex:indexPath.row]email]];

        return cell;
    }

在我的 buttonWasPressed 方法中,我只是这样做:

-(IBAction)buttonWasPressed:(id)sender
{
    UIButton *button = (UIButton *)sender;
  [button setImage:[UIImage imageNamed:@"ticck.jpeg"] forState:UIControlStateNormal];

}

正如我之前所说,它可以工作,但也会更改一些其他按钮图像,而且当我向下滚动并返回初始位置时,我看到一些按钮图像已更改。

4

8 回答 8

6

您可以访问该单元格并将按钮图像更改为:

-(IBAction)buttonWasPressed:(id)sender
{

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:your_row inSection:your_section];
    UITableViewCell *currentCell = [table cellForRowAtIndexPath:indexPath];
    UIButton *button = (UIButton *)[currentCell viewWithTag:(UIButton *)sender.tag];
    [button setImage:[UIImage imageNamed:@"ticck.jpeg"] forState:UIControlStateNormal];
}

希望它可以帮助你。

于 2013-05-28T12:25:57.320 回答
3

您可以在 CustomCell 类中处理触摸。只需-(IBAction)buttonWasPressed:(id)sender在您的自定义类中移动方法并添加 tickButton addTarget:selfaction:@selector(buttonWasPressed:)forControlEvents:UIControlEventTouchUpInsideinit 方法。

于 2013-05-28T12:40:36.210 回答
1

做这个

NSString *CellIdentifier = [NSString stringWithFormat:@"cell%d",indexPath.row];
于 2013-05-28T12:24:12.760 回答
1

当您将默认图像设置为按钮时,请执行此操作

[button setImage:[UIImage imageNamed:@"ticck.jpeg"] forState:UIControlStateSelected];

在您的按钮操作方法中执行以下操作:

-(IBAction)buttonWasPressed:(id)sender
{
  UIButton *button = (UIButton *)sender;
  if(button.selected==NO) {
    [button setSelected:YES];

  }

}

希望这可以帮助。

于 2013-05-28T12:37:30.220 回答
1

问题是打电话

[cell.tickButton addTarget:self action:@selector(buttonWasPressed:)forControlEvents:UIControlEventTouchUpInside];

方法。

每次重复使用单元格时都添加目标,并且永远不会删除。所以你的按钮有很多目标,动作方法分别被多次调用。它可能会导致内存泄漏。

只需将 addTarget 方法放在 if 子句中。

它将解决您的一个问题,即您的方法被多次调用。但是当单元格被重用时,按钮的图像发生了变化。你需要把它放回去。

最好的方法是,向单元格中预设的联系人对象添加一个属性,并在触发操作方法时设置一个值。然后在 cellForRowAtIndexPath: 方法中,您可以通过检查该属性来设置按钮的图像。

于 2013-05-28T12:47:52.470 回答
0

要重复使用您的单元格,您必须在出列后将其清理干净。在这种情况下,您应该首先重置您的图像:

[cell.tickButton setImage:nil forState:UIControlStateNormal];

在将任何内容分配给您的单元之前。

于 2013-05-28T12:29:26.067 回答
0

您必须保存按下的按钮标签而不是尝试这个

if(pressed[cell.tickButton.tag])
    [button setImage:[UIImage imageNamed:@"ticck.jpeg"] forState:UIControlStateNormal];
else 
    [cell.tickButton setImage:nil forState:UIControlStateNormal];
于 2013-05-28T12:33:52.400 回答
0

我猜您正在为 CustomCell 类中的按钮提供默认图像。这个问题在 UITableviews 中很常见。

您需要做的就是跟踪按下按钮的单元格。在cellForRowAtIndexPath方法中执行所有这些操作。

例如:

更新 cellForRowAtIndexPath 方法中的代码

if (cell == nil)
    {
        //create new cell
        cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

如果(你的条件 == YES){

change the button image to the special image.

} 别的{

keep the button image as default image.

}

返回单元格;

要跟踪单元格,您可以将单元格(其按钮已被点击)的索引路径存储在数组中。在 cellForRowAtIndexPath 内部检查当前 indexPath 是否存在于您的数组中

于 2013-05-28T12:34:55.080 回答