2013-02-13 2 views
2

У меня есть простая таблица с пользовательскими ячейками, каждая из которых содержит текстовое поле. В cellForRowAtIndexPath: создать и инициализировать каждую ячейку в зависимости от indexPath.row:Проблема с значениями UITextField в пользовательской ячейке при прокрутке быстрого ios

case 0: 
{ 
    CellIdentifier = @"TextEditCell"; 
    TextEditCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil]; 
     cell = [topLevelObjects objectAtIndex:0]; 
    } 

    [cell configureCellWithText: [self.valueArray objectAtIndex:0] 
        placeholder: @"value no.0"] 

    [cell performAction: @selector(saveValue0:) 
     forControlEvent: UIControlEventEditingDidEnd 
       inTarget: self]; 

    return cell; 
} 

configureCellWithText: Заполнитель: наборы текста и заполнитель из TextField клетки. performAction: forControlEvent: inTarget ссылается непосредственно на textField и сохраняет значение textField для локального массива, чтобы быть точным при повторном использовании.

Проблема возникает, когда я быстро прокручиваю таблицу. Значения из разных ячеек копируются в другие ячейки и изменяют локальный массив. Я не могу понять, почему это происходит. У кого-нибудь есть идея? При необходимости я могу предоставить больше кода.

ответ

0

Это происходит потому, что вы повторно используете ячейки, а configureCellWithText запускается после повторного использования ячейки. Чтобы решить эту проблему, вы можете:

  1. Не используйте ячейки повторно - но это действительно повредит вашей работе.
  2. Если вы используете 6.0, вы можете использовать tableView:didEndDisplayingCell:forRowAtIndexPath:, чтобы отменить действие по настройке текста, когда ячейка прокручивается с экрана.
  3. Вы можете создать флаг в своем пользовательском классе ячеек, который вы устанавливаете при деактивации ячейки.

Редактировать

Потому что я не знаю, как ваши клетки работает. Мне трудно дать вам что-то большее, чем концепцию sudo-кода.

Вот мой Судо код:

Tableview клеток для ряда ... - Dequeue клеток - [клетка cancel_previous_action] - множество новых действий.

+0

Варианты 1 и 2 не подходят для меня. Можете ли вы предоставить более подробную информацию о третьем? Я создал флаг в своем классе TextEditCell - как я должен обрабатывать его в 'cellForRowAtIndexPath:'? Кроме того, в моем коде каждая ячейка имеет тот же CellIdentifier - должен ли я диверсифицировать ее для каждой ячейки? Используется ли этот CellIdentifier в 'dequeueReusableCellWithIdentifier:' должен быть таким же, как в функции 'loadNibNamed:'? (отредактируйте свой первоначальный ответ - для следующих поколений) – deleteme