Iphone 如何在使用UITableViewCell缓存时向左侧的UITableView添加复选框?

Iphone 如何在使用UITableViewCell缓存时向左侧的UITableView添加复选框?,iphone,uitableview,caching,checkbox,scroll,Iphone,Uitableview,Caching,Checkbox,Scroll,我在尝试将复选框作为待办事项列表的一部分时遇到了不少麻烦。 我有一个UITableView,每个UITableViewCell都应该在左侧有自己的复选框 如果有人能告诉我如何做到这一点,我将不胜感激。我已经在这个网站上广泛地查看了这些问题,但仍然不知道如何实现这一点 滚动tableview时会出现问题。例如,如果我有20个待办事项,当我滚动时,将要选择的复选框将被取消选择,将要取消选择的复选框将以看似随机的方式被选中。一定是滚动的问题 当系统重用一个单元时,缓存和发生了什么?我是否正在抓取一个空

我在尝试将复选框作为待办事项列表的一部分时遇到了不少麻烦。 我有一个UITableView,每个UITableViewCell都应该在左侧有自己的复选框

如果有人能告诉我如何做到这一点,我将不胜感激。我已经在这个网站上广泛地查看了这些问题,但仍然不知道如何实现这一点

滚动tableview时会出现问题。例如,如果我有20个待办事项,当我滚动时,将要选择的复选框将被取消选择,将要取消选择的复选框将以看似随机的方式被选中。一定是滚动的问题

当系统重用一个单元时,缓存和发生了什么?我是否正在抓取一个空单元格,其中只包含对空子视图的引用

如果tablecell#1的视图标记为10,那么tablecell#2的视图标记是否为10?或者在整个tableView中不重复标记?(我甚至不确定这是否是问题所在)

谢谢大家!

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

switch (selectedSegment) {

case Todos:{

            static NSString *ToDoCellIdentifier = @"TodoTableViewCell";
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifierToDoCellIdentifier];

            UITextView *taskTextView = nil;
            UIButton *checkBox = nil;
            UIImageView *highPriorityIcon = nil;

            if (cell == nil) {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:signoutTableViewCellIdentifier] autorelease];


                checkBox = [[UIButton alloc]initWithFrame:CGRectMake(1, 1, 25, 25)];
                checkBox.tag = indexPath.row;
                UIImage *normalImage = [UIImage imageNamed: @"checkbox_unchecked@2x.png"];

                UIImage *selectedImage = [UIImage imageNamed: @"checkbox_checked@2x.png"];
                [checkBox setImage:normalImage forState:UIControlStateNormal];
                [checkBox setImage:selectedImage forState:UIControlStateSelected];

                [checkBox addTarget:self action:@selector(historyButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; 
                [cell.contentView addSubview:checkBox];
                [checkBox release];

                //cell.contentView.backgroundColor = [UIColor lightGrayColor];
                cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
                NSLog(@"creating a new cell");

            }

            if (!checkBox) {

                checkBox = (UIButton*)[cell viewWithTag:indexPath.row];
            }


            }


            if ([[self.tasksCheckedStates objectAtIndex:indexPath.row]boolValue]) {



                checkBox.selected = YES;

            }
            else {


                checkBox.selected = NO;
            }



            return cell;
            break;
        }

您需要执行以下操作:

  • 将选中/未选中状态存储在后台数据模型中,而不仅仅作为单元格的属性。该单元被重用,因此您不能将该单元的属性用于持久性
  • 在cellForRowAtIndexPath方法中,确保取消选中未选中项的指示器(无论您是如何实现的),以及选中已选中项的指示器。同样,这些单元格被重复使用,以便选中的单元格可以为未选中的项目退出队列
编辑

你在我写答案的时候发布了你的代码!我认为您的问题在于您分配给复选框的标记。您不应该为此使用索引路径行,因为当您向下滚动到第20行时,您将没有对此的引用。为复选框的所有单元格指定相同的标记,您应该可以。您可以使用标记来区分superview中的视图,因此复选框在所有单元格中具有相同的标记没有问题

关于您的另一个问题,还有一点:当一个单元格从表中退出队列时,您将返回原始对象,其所有视图和数据与上次使用的相同。所以,如果你什么也不做,只是将一个单元格出列,如果丢失了就创建它,然后返回它,那么你的第一屏数据就会不断重复。正常的操作过程是

  • 出列单元
  • 如果没有返回任何单元格,则创建一个新单元格并执行基本的、不更改的配置
  • 设置特定行的单元格

您需要执行以下操作:

  • 将选中/未选中状态存储在后台数据模型中,而不仅仅作为单元格的属性。该单元被重用,因此您不能将该单元的属性用于持久性
  • 在cellForRowAtIndexPath方法中,确保取消选中未选中项的指示器(无论您是如何实现的),以及选中已选中项的指示器。同样,这些单元格被重复使用,以便选中的单元格可以为未选中的项目退出队列
编辑

你在我写答案的时候发布了你的代码!我认为您的问题在于您分配给复选框的标记。您不应该为此使用索引路径行,因为当您向下滚动到第20行时,您将没有对此的引用。为复选框的所有单元格指定相同的标记,您应该可以。您可以使用标记来区分superview中的视图,因此复选框在所有单元格中具有相同的标记没有问题

关于您的另一个问题,还有一点:当一个单元格从表中退出队列时,您将返回原始对象,其所有视图和数据与上次使用的相同。所以,如果你什么也不做,只是将一个单元格出列,如果丢失了就创建它,然后返回它,那么你的第一屏数据就会不断重复。正常的操作过程是

  • 出列单元
  • 如果没有返回任何单元格,则创建一个新单元格并执行基本的、不更改的配置
  • 设置特定行的单元格