滚动时表格视图返回错误的值
问题是我已经实现了一个表格视图与故事板的自定义单元格。 每个单元格都有一个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方法来设置基于其行的正确图像。