2013-04-12 48 views
0

我正在开发一个应用程序使用Xcode 4.6.1> iOS 5.0版本。UITableView怪异行为

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

要显示问题,我有UIScrollView,我正在使用pagingEnabled模式。我有三种问题选择类型,分别是checkbox,radio 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

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

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

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

+0

如果未取消分配,假设第0节中的第四个单元格不显示,为什么我在cellForAtIndexPath方法后得到零,这是否正常? – limon

+0

我不清楚评论中的问题。什么值'nil'什么时候? – vacawama

+0

比方说,第四个单元格不在屏幕上,当我使用self.tableView cellForAtIndexPath:indexPath,对于第0和第4行,我得到零。但是,你说过屏幕外的单元没有被释放。 – limon