滚动时表视图返回错误的值(Table view return wrong values when s

2019-11-03 09:02发布

问题是,我已经实现了从故事板自定义单元格的表视图。 每个单元都有一个按钮,选择按钮这意味着每当我按下一个按钮,它的图像变化。 例如,如果我按下的按钮与小区索引= 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];
            }

Answer 1:

在这里你在做什么是获得相同UIButton对象的每一个细胞。 你需要为每一个细胞创建一个单独的按钮。

确定此UIButton对象,具有独特的标签,然后选中该单元格进行进一步。

创建一个标签UIButton对象。 下面放线后,在您的视图控制器类的顶部#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];

在您选择的方法,检查该按钮标签。

- (void) select:(UIButton *)sender {
    NSInteger tag = sender.tag;
    NSInteger index = tag - kButtonTag;

    // Above index is unique index for your cell.
}

希望你能得到的想法,从这个简短解释。



Answer 2:

这是到小区重用。 当细胞滚动出屏幕,它们被放入队列中的其它细胞出现在屏幕上,以进行再利用。 出列方法拉他们关闭此队列。 你的问题是,当这种情况发生的按钮图像不会被重置,所以如果它以前被改变,它仍然wiil。

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



文章来源: Table view return wrong values when scrolling