UITableviewCell中的按钮图像更改?

时间:2009-12-10 12:21:51

标签: iphone

我在UITableviewCell.i中有一个带图像的按钮可以选择按钮动作作为toggleButton方法。如果触摸按钮特别是Cell, 相应的tablecell按钮的图像被更改。但是当我滚动tableview时,更改的图像在另一个单元格中。我可以避免它吗?请看我的代码......。你能说出我要做的事情吗?我不会我想使用did select方法,我必须做其他Operation.any帮助吗?

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

    onButton = [UIButton buttonWithType:UIButtonTypeCustom];
    onButton.tag = 1;       

    onButtonView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 30, 50)];
    onButtonView.tag = 2;
    onButtonView.image = [UIImage imageNamed:@"NotSelected.png"];
    [onButton setBackgroundImage:[onButtonView.image stretchableImageWithLeftCapWidth:0.0 topCapHeight:0.0] forState:UIControlStateNormal];
    [cell addSubview:onButton];
    [onButton addTarget:self action:@selector(toggleButton:) forControlEvents: UIControlEventTouchUpInside];
    [onButtonView release];
 } 


return cell;

  }

4 个答案:

答案 0 :(得分:3)

您遇到此问题是因为您正在重复使用显示的单元格。这是创建单元格的正确方法,因为否则您将使用大量内存。

首先,从if-case中删除以下内容。把它放在下面:

onButton = [UIButton buttonWithType:UIButtonTypeCustom];
onButton.tag = 1;               

onButtonView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 30, 50)];
onButtonView.tag = 2;
onButtonView.image = [UIImage imageNamed:@"NotSelected.png"];
[onButton setBackgroundImage:[onButtonView.image stretchableImageWithLeftCapWidth:0.0 topCapHeight:0.0] forState:UIControlStateNormal];
[cell addSubview:onButton];
[onButton addTarget:self action:@selector(toggleButton:) forControlEvents: UIControlEventTouchUpInside];
[onButtonView release];

您正在尝试通过“dequeueReusableCellWithIdentifier”获取单元格。这意味着如果单元格尚不存在,(if (cell == nil))它将创建一个单元格。 您只需在创建单元格时设置按钮图像。如果在if-case之后设置它,即使您的单元格不是nil,也总是将图像设置为“not selected”。

从这开始,它可能会解决您的问题。

答案 1 :(得分:1)

您的tableView:cellForRowAtIndexPath:方法将返回以前使用过的不再使用的单元格。您需要确保在重复使用单元格时重置图像。你需要做这样的事情:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell) {
    // Reusing cell; make sure it has correct background
    UIImageView *onBut = (UIButton *)[cell viewWithTag:1];
    onBut.image = [UIImage imageNamed:@"NotSelected.png"];
    // etc.
}
else {
    // Create cell
    // ...
}

请注意,如果您选择的单元格滚动回到视图中,则需要将图像设置为“选定”图像。

答案 2 :(得分:0)

当您在-cellForRowAtIndexPath方法中重复使用单元格时,必须重置其所有属性,否则单元格可能具有您之前为其他indexPath设置的属性。
因此,您必须在某处保存单元格状态,并在-cellForRowAtIndexPath每次调用方法时为onButton设置图像。

答案 3 :(得分:0)

如果您的表大小有限,最简单的方法是使用预先初始化的单元格创建NSArray。 内存使用对于十几个单元格来说并不重要

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    return [myCells objectAtIndex:indexPath.row];
}