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

时间:2014-10-16 07:11:28

标签: ios xcode uitableview scroll

问题是我已经使用故事板中的自定义单元格实现了一个表格视图。每个单元格都有一个按钮作为选择按钮,这意味着无论何时按下按钮,它都会改变图像。例如,如果我按下单元格索引= 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];
            }

2 个答案:

答案 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方法中添加一些代码,以根据其行设置正确的图像。