在我的应用程序中,我面临一个非常奇怪的问题。我试图解决它几个小时但到目前为止找不到问题。
好吧,我有自定义单元格的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];
}
正如我之前说过的那样有效,但也改变了其他一些按钮图像,当我向下滚动并回到初始位置时,我看到一些按钮图像被更改。
答案 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