iphone开发:更改uitableviewcell上的按钮图像

时间:2013-05-28 12:19:47

标签: iphone ios objective-c uitableview

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

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

    - (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];

}

正如我之前说过的那样有效,但也改变了其他一些按钮图像,当我向下滚动并回到初始位置时,我看到一些按钮图像被更改。

8 个答案:

答案 0 :(得分: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];
}

希望它对你有所帮助。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

这样做

NSString *CellIdentifier = [NSString stringWithFormat:@"cell%d",indexPath.row];

答案 3 :(得分:1)

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

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

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

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

  }

}

希望这有帮助。

答案 4 :(得分:1)

问题在于调用

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

方法

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

将addTarget方法放在if子句中。

它将解决您的一个问题,即您的方法被多次调用。但是当重复使用单元格时,按钮具有更改的图像。你需要重新设置它。

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

答案 5 :(得分:0)

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

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

在为您的手机分配任何内容之前。

答案 6 :(得分:0)

您必须保存已按下的按钮标签,而不是尝试此

if(pressed[cell.tickButton.tag])
    [button setImage:[UIImage imageNamed:@"ticck.jpeg"] forState:UIControlStateNormal];
else 
    [cell.tickButton setImage:nil forState:UIControlStateNormal];

答案 7 :(得分:0)

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

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

例如:

更新cellForRowAtIndexPath方法中的代码

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

如果(的 yourCondition == YES){

change the button image to the special image.

}   否则{

keep the button image as default image.

}

返回单元格;

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