问题是我已经使用故事板中的自定义单元格实现了一个表格视图。每个单元格都有一个按钮作为选择按钮,这意味着无论何时按下按钮,它都会改变图像。例如,如果我按下单元格索引= 0的按钮,它的图像会正确更改,但是当滚动表格时我发现其他按钮也改变了它们的图像!问题来自表索引路径,我花了很多时间尝试修复它而没有结果。 任何解决方案?
static NSString *simpleTableIdentifier = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:simpleTableIdentifier];
NSLog(@"index path inside cell = nil %i",(int)indexPath);
}
buttonObj=(UIButton *)[cell viewWithTag:40];
[buttonObj addTarget:self action:@selector(select:) forControlEvents:UIControlEventTouchDown];
return cell;
-(void) select:(id)sender{
UIButton *button=(UIButton *)sender;
UITableViewCell *clickedCell = (UITableViewCell*)[[sender superview] superview];
NSIndexPath *indexPathCell = [addFriendTableView indexPathForCell:clickedCell];
NSLog(@"indexPathCell %i",(int)indexPathCell.row);
Contacts* selectedContact = [contactsArray objectAtIndex:indexPathCell.row];
if([self image:button.imageView.image isEqualTo:[UIImage imageNamed:@"addFriend.png"]]==YES){
[button setImage:[UIImage imageNamed:@"addFriendPressed.png"] forState(UIControlStateNormal)];
[selectFriendsArray addObject:selectedContact];
counter++
}
else if( [self image:button.imageView.image isEqualTo:[UIImage imageNamed:@"addFriendPressed.png"]]==YES)
{
[button setImage:[UIImage imageNamed:@"addFriend.png"] forState:(UIControlStateNormal)];
counter--;
[selectFriendsArray removeObject:selectedContact];
}
答案 0 :(得分:1)
您正在做的是为每个单元格获取相同的UIButton
对象。您需要为每个单元格创建一个单独的按钮。
使用唯一标记标识此UIButton
对象,然后再选择该单元格。
为UIButton
对象创建标记。在#import
个参数
#define kButtonTag 1000
现在为每个对象设置唯一标记。
static NSString *simpleTableIdentifier = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:simpleTableIdentifier];
NSLog(@"index path inside cell = nil %i",(int)indexPath);
}
// kButtonTag = 1000
NSInteger btnTag = kButtonTag + indexPath.row;
[[cell.contentView viewWithTag:btnTag] removeFromSuperview];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
// Set button properties which you required here...
//....
[button setTag:[cell viewWithTag:kButtonTag + indexPath.row]];
[button addTarget:self action:@selector(select:) forControlEvents:UIControlEventTouchDown];
[cell.contentView addSubview:button];
在您的select方法中,检查该按钮标记。
- (void) select:(UIButton *)sender {
NSInteger tag = sender.tag;
NSInteger index = tag - kButtonTag;
// Above index is unique index for your cell.
}
希望你能从这个简短的解释中得到想法。
答案 1 :(得分:0)
这归结于细胞重用。当单元格滚动离开屏幕时,它们将被放入队列中,以便在屏幕上显示其他单元格时重复使用。 dequeue方法将它们从这个队列中拉出来。你的问题是,当这种情况发生时,按钮图像不会被重置,所以如果之前已经改变了按钮图像,它将会保留。
您需要在cellForRowAtIndexPath方法中添加一些代码,以根据其行设置正确的图像。