代码之家  ›  专栏  ›  技术社区  ›  limon

UITableView中的怪异行为

  •  0
  • limon  · 技术社区  · 11 年前

    我正在使用Xcode 4.6.1为>iOS 5.0版本。

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

    为了回答问题,我有一个 UIScrollView 我正在使用它 分页启用模式 .我有三种问题选择类型,它们是 checkbox , radio button textfield 。对于UI控件,我创建了 CheckBoxButton RadioButton 简单继承自的类 UIButton 。我已通过更改背景图像设置了选择属性。因此,每一页都包含一个问题和 checkboxes | radio buttons 根据选择计数。如果选择计数为4,则显示4个复选框。

    如果问题和选择不适合页面,我将创建 UITableView 我正在将其添加到 UIS滚动视图 作为子视图。而不是使用 UI表格视图 ,我试着用 UIS滚动视图 但这会让事情变得更糟。所以,这并不是一个真正的选择。创建 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 回复  |  直到 11 年前
        1
  •  1
  •   vacawama    11 年前

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

    UITableView用于显示表格。它不用于存储任何信息。在您的情况下,如果有人选中某个复选框,您会想知道该复选框的状态。要获得该状态,您需要添加 target action 这样,如果有人触摸复选框并更改其状态,您就会被呼叫。

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