表视图scrolling / dequeueReusableCell问题

时间:2015-03-12 10:17:45

标签: ios objective-c uitableview

我有一张桌子视图&自定义单元格。单元格包含3个按钮(复选框类型)。在按钮上单击我需要更改的相应按钮文本(选中/取消选中)。 我实现了这一点,但是当我点击顶部单元格上的第一个按钮并向下滚动时,底部的新单元格也有这个复选标记,当我滚动回到顶部时,复选标记被移动到下一个单元格..如何解决这个问题? ?

代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *strCellIdentifier = @"RemoteCell";


    RemoteCustomCell *cell = (RemoteCustomCell*)[tableView ![dequeueReusableCell][2]WithIdentifier:strCellIdentifier];
    if (cell == nil) {
        cell = [[RemoteCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:strCellIdentifier];
    }
    else    {
        cell = [cell initWithStyle:UITableViewCellStyleDefault reuseIdentifier:strCellIdentifier];
    }

  [cell.btnCheck1 addTarget:self action:@selector(CheckButton1_Click:) forControlEvents:UIControlEventTouchUpInside];            
    }
    return cell;

}


- (void)CheckButton1_Click:(UIButton*)sender
{
    RemoteControllCustomCell *clickedCell = (RemoteControllCustomCell *)[[sender superview] superview];

    if(clickedCell.btnCheck1.selected)
    {      
        [clickedCell.btnCheck1 setTitle:@"O" forState:UIControlStateNormal];        
        clickedCell.btnCheck1.selected = NO;
    }
    else
    {      
        [clickedCell.btnCheck1 setTitle:@"X" forState:UIControlStateSelected];
        clickedCell.btnCheck1.selected = YES;
    }
}

截图:

enter image description here

enter image description here

4 个答案:

答案 0 :(得分:5)

在RemoteCustomCell.m文件中,您应该实现

- (void)prepareForReuse
{
     [super prepareForReuse];
     cell.btnCheck1.selected = NO;
}

这样重用的每个单元格都会将它的btnCheck1.selected值设置为NO,当你在cellForRowAtIndexPath中加载单元格时,只有当单元格可见并且你将它设置为时它才会将其设置为YES这一点。

但是将所有值存储在NSMutableArray中是关键。没有将值存储在单元格中的事情,它们会在无法预见的基础上重复使用。将值添加到数组中,然后使用[myArray objectAtIndex:indexPath.row];在单元格中打开这些值。

一个例子:

viewDidLoad中的某个地方

NSMutableArray *myArray = [[NSMutableArray alloc] initWithObjects:@"1", @"0", @"1", @"1", nil];

cellForRowAtIndexPath

BOOL yesOrNo = [[myArray objectAtIndex:indexPath.row] boolValue];

然后将button.selected设置为布尔值。

答案 1 :(得分:1)

这是一个典型问题,您依赖UI来完成模型的工作。模型,你应该传递给UITableViewCell的东西,所以它可以构建,它会告诉它,它应该显示“X”还是“O”。由于您没有这样做,最简单的解决方案是在每次出列时简单地重置单元的状态。

答案 2 :(得分:0)

我认为您需要将状态存储在数组中并检查

中的状态
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

CheckButton1_Click确实改变状态,但是当dequeueReusableCell,它再次从cellForRowAtIndexPath加载。

答案 3 :(得分:0)

好像你已经出现了细胞问题。您可以实施以下cellForRowAtIndexPath方法。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifier = @"RemoteCell";
    RemoteCustomCell *cell = (RemoteCustomCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell==nil) {
        NSArray *arrNib=[[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil];
        cell= (RemoteCustomCell *)[arrNib objectAtIndex:0];   
    }
    [cell.btnCheck1 addTarget:self action:@selector(CheckButton1_Click:) forControlEvents:UIControlEventTouchUpInside]; 
    return cell;
}