我在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;
}
答案 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];
}