在UITableview中滚动时,UiButton状态不断变化

时间:2014-08-10 08:01:35

标签: ios uitableview uibutton reuseidentifier

我知道有一些帖子,但我仍然感到困惑,为什么我在tableview中创建的按钮在选择时不会保持其状态。当我滚动时,未选择的按钮会受到影响,它会来回变化。请帮忙。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];

    static NSString *simpleTableIdentifier = @"SimpleTableCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
        UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [myButton setTitle:@"Like" forState:UIControlStateNormal];
        [myButton addTarget:self action:@selector(tapped:) forControlEvents:UIControlEventTouchUpInside];
        myButton.frame = CGRectMake(14.0, 10.0, 125.0, 25.0);
        myButton.tag =indexPath.row;
        [cell.contentView addSubview:myButton];



    }
    else{
        [cell.contentView addSubview:myButton];

    }
 if ([array objectAtIndex:indexPath.row==0]) {
        [myButton setTitle:@"Like" forState:UIControlStateNormal];

    }
    else{
        [myButton setTitle:@"Unlike" forState:UIControlStateNormal];


    }


    cell.textLabel.text = [recipes objectAtIndex:indexPath.row];

    return cell;
}


-(void)tapped:(UIButton *)sender {

    if ([sender.currentTitle isEqualToString:@"Like"]) {
        [sender setTitle:@"Unlike" forState:UIControlStateNormal];
[array replaceObjectAtIndex:sender.tag withObject:[NSNumber numberWithInt:1]];
    }
    else{
        [sender setTitle:@"Like" forState:UIControlStateNormal];

    }


}

1 个答案:

答案 0 :(得分:0)

帮助您了解发生这种情况的原因;每次在表格视图的屏幕上显示行的单元格时,都会调用tableView:cellForRowAtIndexPath:方法来检索将要显示的单元格。也就是说,当第一次显示单元格时,会调用此方法。然后,如果此单元格进入屏幕,然后再次返回到屏幕,则此方法将再次被称为 ,以设置和检索单元格。

因此,在这种情况下,您正在为Recipe A显示一个单元格(上面有一个按钮)。按下按钮,改变它的状态。当Recipe A离开屏幕,然后返回到屏幕上时,您将返回另一个单元格(因为表格单元格重新使用dequeueReusableCellWithIdentifier:)。对于该单元格上的按钮,有两件事情正在发生:

  • 第一次使用时,单元格上已有一个按钮(可能是另一个配方)。你不会告诉它是否应该在“喜欢的”中。或者'不喜欢' Recipe A的状态。
  • 您向该单元格添加了另一个按钮,但您实际上并未设置其框架/标题,因此您实际上无法以任何方式查看它。

您需要做的是在您的模型中的某个位置保留用户所喜欢的项目(食谱)的轨道。您可以使用tapped:方法在某处执行此操作。

然后,在您的tableView:cellForRowAtIndexPath:方法中,您需要将该按钮设置为该行/配方的相应状态('喜欢与否)。

每次调用方法时都需要确保这样做,而不仅仅是在if (cell == nil)块中。顺便说一下,您使用dequeueReusableCellWithIdentifier:代替dequeueReusableCellWithIdentifier:indexPath是否有理由?后者从iOS 6开始提供,并且保证返回一个单元格,因此您不需要执行此if (cell == nil)业务。