Ios UITableView中的怪异行为
我正在使用Xcode 4.6.1 for>iOS 5.0版本开发一个应用程序 该应用程序只是简单地显示从服务器端获取、保存在数据库中并允许用户填写的问卷 为了显示问题,我使用了一个Ios UITableView中的怪异行为,ios,uitableview,ios5,ios6,Ios,Uitableview,Ios5,Ios6,我正在使用Xcode 4.6.1 for>iOS 5.0版本开发一个应用程序 该应用程序只是简单地显示从服务器端获取、保存在数据库中并允许用户填写的问卷 为了显示问题,我使用了一个UIScrollView,并在分页启用模式下使用它。我有三种问题选择类型,分别是复选框,单选按钮和文本字段。对于UI控件,我创建了CheckBoxButton和RadioButton类,它们只是从UIButton继承而来。我通过更改背景图像设置了选择属性。因此,根据选项计数,每页都包含一个问题和复选框|单选按钮。如果选
UIScrollView
,并在分页启用模式下使用它。我有三种问题选择类型,分别是复选框
,单选按钮
和文本字段
。对于UI控件,我创建了CheckBoxButton
和RadioButton
类,它们只是从UIButton
继承而来。我通过更改背景图像设置了选择属性。因此,根据选项计数,每页都包含一个问题和复选框|单选按钮。如果选择计数为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];
我知道如果屏幕上没有一个单元格,它就不存在。我的问题是。假设我选中了第四个复选框并向上滚动,这样第四个单元格就不再显示了。当我向下滚动时,第四个单元格将使用上述代码重新创建。我的问题是它是用旧的身份创建的。这意味着,当我在向上滚动之前选中时,它将在“选中”中重新创建
怎么可能呢?我错过了什么?我没有使用任何缓存机制。为了提高效率,iOS重用表单元格。当你的手机在屏幕上滚动时,它不会被释放。相反,它被抛出到重用队列中。当单元格重新出现在屏幕上时,系统将从重用队列(如果可用)中获取一个单元格,并将其交给您。以前添加到该单元的所有子视图仍然存在,因此您需要清理该单元并正确初始化它,否则您将看到以前该单元中的内容
UITableView用于显示表格。它不用于存储任何信息。在您的情况下,如果有人检查复选框,您将希望了解其状态。要获得该状态,您需要将target
和action
添加到您的复选框中,以便在有人触摸复选框并更改其状态时调用您
在操作方法中,需要将复选框的值存储在作为视图控制器(而不是表视图)一部分的数据结构中。在重新创建屏幕外但现在已重新出现的单元格时,您还需要查看此数据结构。如果未取消分配,假设第0节中的第四个单元格未显示,为什么在cellForAtIndexPath方法后我得到零,这正常吗?我不清楚评论中的问题。什么值为nil
以及何时?比方说,第四个单元格不在屏幕上,当我使用self.tableView cellForAtIndexPath:indexPath时,对于第0节和第4行,我得到了nil。但是,你说过屏幕外的单元格不会被释放。你是说cellforrowatinexpath
?由系统调用以获取要显示的单元格。你不应该这么叫。如果需要了解单元格中复选框的状态,则应向其添加目标
和操作
,并将该信息存储在模型或视图控制器中。一旦一个单元格从屏幕上滚下来,无论出于何种目的,它都会消失,任何信息都会随之消失。事实上,内存仍然在那里,正如我前面提到的,在重用队列中,但此时您不应该尝试与它交互。