2013-04-12 3 views
0

Я разрабатываю приложение с использованием Xcode 4.6.1 для версии> iOS 5.0.Странное поведение в UITableView

Приложение просто отображает анкеты, которые были получены с серверной части, сохранены в базе данных и позволяют ее пользователям заполнять ее.

Чтобы показать вопросы, у меня есть UIScrollView, и я использую его в pagingEnabled mode. У меня есть три типа типа выбора вопросов: checkbox, radio button и textfield. Для элементов управления пользовательского интерфейса я создал классы CheckBoxButton и RadioButton, которые просто унаследованы от 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 используется для отображения таблицы. Он не используется для хранения какой-либо информации. В вашем случае вы захотите узнать состояние флажка, если кто-то его проверит. Чтобы получить это состояние, вы захотите добавить target и action к своему флажку, чтобы вы получили вызов, если кто-то коснется этого флажка и изменит его состояние.

В вашем методе действий вам нужно будет сохранить значение этого флажка в структуре данных, которая является частью вашего контроллера представления (а не вида таблицы). Вам также нужно будет посмотреть эту структуру данных при воссоздании ячейки, которая была вне экрана, но теперь снова появилась.

+0

Если он не освобожден, скажем, четвертая ячейка в разделе 0 не отображается, почему я получаю нуль после метода cellForAtIndexPath, это нормально? – limon

+0

Я не совсем понял вопрос в комментарии. Что имеет значение 'nil' и когда? – vacawama

+0

, скажем, четвертая ячейка вне экрана. Когда я использую self.tableView cellForAtIndexPath: indexPath, для раздела 0 и строки 4, я получаю нуль. Но вы сказали, что ячейка, которая находится вне экрана, не освобождается. – limon