Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UITableView中的怪异行为_Ios_Uitableview_Ios5_Ios6 - Fatal编程技术网

Ios UITableView中的怪异行为

Ios UITableView中的怪异行为,ios,uitableview,ios5,ios6,Ios,Uitableview,Ios5,Ios6,我正在使用Xcode 4.6.1 for>iOS 5.0版本开发一个应用程序 该应用程序只是简单地显示从服务器端获取、保存在数据库中并允许用户填写的问卷 为了显示问题,我使用了一个UIScrollView,并在分页启用模式下使用它。我有三种问题选择类型,分别是复选框,单选按钮和文本字段。对于UI控件,我创建了CheckBoxButton和RadioButton类,它们只是从UIButton继承而来。我通过更改背景图像设置了选择属性。因此,根据选项计数,每页都包含一个问题和复选框|单选按钮。如果选

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

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

为了显示问题,我使用了一个
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
?由系统调用以获取要显示的单元格。你不应该这么叫。如果需要了解单元格中复选框的状态,则应向其添加
目标
操作
,并将该信息存储在模型或视图控制器中。一旦一个单元格从屏幕上滚下来,无论出于何种目的,它都会消失,任何信息都会随之消失。事实上,内存仍然在那里,正如我前面提到的,在重用队列中,但此时您不应该尝试与它交互。