滚动时表格视图返回错误的值

问题是我已经实现了一个表格视图与故事板的自定义单元格。 每个单元格都有一个button作为selectbutton,这意味着每当我按下一个button时,它的图像就会变化。 例如,如果我按下单元索引= 0的button,它的图像正确改变,但是当滚动表时我发现​​其他button也改变了他们的图像! 问题是从表索引path,我花了很多时间试图解决它没有结果。 任何解决scheme

谢谢

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

这里你正在做的是获得每个单元格相同的UIButton对象。 您需要为每个单元格创build一个单独的button。

使用唯一标记标识此UIButton对象,然后select该单元格作进一步处理。

UIButton对象创build一个标签。 在#import statments之后,在视图控制器类的顶部放置下面的行

 #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的方法中,检查那个button标签。

 - (void) select:(UIButton *)sender { NSInteger tag = sender.tag; NSInteger index = tag - kButtonTag; // Above index is unique index for your cell. } 

希望你能明白,从这个简短的解释。

这是细胞再利用。 当单元格从屏幕上滚动出来时,它们被放入一个队列中,以便其他单元格出现在屏幕上。 出队方法将其从队列中拉出。 你的问题是,当这种情况发生时,button图像不会被重置,所以如果它以前被改变,它将保持。

您需要添加一些代码到您的cellForRowAtIndexPath方法来设置基于其行的正确图像。