UITableView中的奇怪行为

时间:2013-04-12 12:47:32

标签: ios uitableview ios5 ios6

我正在使用Xcode 4.6.1开发一个用于> iOS 5.0版本的应用程序。

该应用程序只显示从服务器端获取的问卷,保存在数据库中并允许其用户填写。

要显示问题,我有一个UIScrollView,我正在 pagingEnabled模式中使用它。我有三种问题选择类型:checkboxradio buttontextfield。对于UI控件,我创建了CheckBoxButtonRadioButton类,它们只是从UIButton继承而来。我通过改变背景图像来设置选择属性。因此,根据选择计数,每个页面都包含一个问题和checkboxes | radio buttons。如果选择计数为4,则显示4个复选框。

如果问题和选项不适合页面,我正在创建UITableView,我将其作为子视图添加到UIScrollView。我没有使用UITableView,而是尝试使用UIScrollView,但这会让事情变得更糟。所以,这不是一个真正的选择。要创建UITableViewCell,我正在使用此代码。

static NSString *cellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if(cell == nil)
    {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        cell.selectionStyle = UITableViewCellSelectionStyleNone ;
    }
        QuestionChoice *currentChoice =  [[[[_questionArray objectAtIndex:currentQuestionIndex] choices] allObjects ] objectAtIndex:indexPath.row -1 ];
        CheckBoxButton *checkBox = [[CheckBoxButton alloc] initWithXValue:20 yValue:0 tag:0];
        [cell addSubview:checkBox];
        UIFont *aeroSmall = [UIFont fontWithName:@"Aero" size:22.0f];
        NSString *choiceText = currentChoice.choiceText;
        CRTLabel *choiceLabel = [[CRTLabel alloc] initWithFrame:CGRectMake(80, 0, 700, 44) andText:choiceText font:aeroSmall tag:0];
        [cell addSubview:choiceLabel];

我知道如果屏幕上没有单元格,则它不存在。我的问题在于此。假设我已经检查了第四个复选框并向上滚动,这样第四个单元格就不再显示了。当我向下滚动时,第四个单元格将通过使用上面的代码重新创建。我的问题是它是用旧状态创建的。这意味着当我在向上滚动之前检查时,它会在选中时重新创建。

怎么可能?我错过了什么?我没有使用任何缓存机制。

1 个答案:

答案 0 :(得分:1)

为了效率,iOS重用表格单元格。当您的单元格滚出屏幕时,它不会被取消分配。相反,它被抛入重用队列。当单元格重新出现在屏幕上时,系统会从重用队列中抓取一个单元格(如果可用)并将其交给您。您之前添加到该单元格的所有子视图仍然存在,因此您需要清理该单元格并正确初始化它,否则您将看到之前该单元格中的任何内容。

UITableView用于显示表格。它不用于存储任何信息。在您的情况下,如果有人检查,您将需要知道复选框的状态。要获得该状态,您需要将targetaction添加到您的复选框,以便在有人触摸该复选框并更改其状态时您将被调用。

在您的操作方法中,您需要将复选框的值存储在数据结构中,该数据结构是视图控制器的一部分(而不是表视图)。在重新创建一个屏幕外但现在又重新出现的单元格时,您还需要查看此数据结构。