2013-04-14 2 views
1

Всякий раз, когда я создаю новую ячейку, возникает странная магия. Если я выйду из контроллера просмотра позже (со всеми сохраненными данными) и снова вернусь к контроллеру представления (с перезагрузкой данных и т. Д.), Все в порядке (но если я останусь в контроллере просмотра, он перепутался)UITableViewCell willDisplayCell метод conundrum

Теперь позвольте мне описать эту странную магию:

  • у меня есть обычай UITableViewCell
  • Когда indexPath даже, синий круг существует в нем
  • Когда indexPath нечетное, зеленый прямоугольник в нем

Однако, когда создается новая ячейка, в ней есть зеленый прямоугольник и синий круг, как это возможно?

- (void)tableView:(UITableView *)tableView willDisplayCell:(CustomCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (cell.blueCircle) cell.blueCircle = nil; 
    if (cell.greenRect) cell.greenRect = nil;  
    if (indexPath.row % 2 == 0){ 
     NSLog(@"Even indexPath: %@", indexPath); 
     //some of the code not shown here creates a blue circle 
     [cell addSubview:cell.blueCircle]; 
    } 
    else { 
     NSLog(@"Odd indexPath: %@", indexPath); 
     //some of the code not shown here creates a green rectangle 
     [cell addSubview:cell.greenRect]; 
    } 
} 

Обратите внимание, что я получаю только один NSLog, либо нечетное или даже один, так почему я получаю две формы вместо того, чтобы только один?

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

Что вы думаете об этом?

ответ

5

Поскольку ячейки вытаскиваются из очереди повторного использования, они не полностью перерисовываются, если вы не попросите их перерисовать с помощью -setNeedsDisplayInRect: и передать в грязный прямоугольник, который необходимо перерисовать. В противном случае вам нужно будет нарисовать прямоугольник синего цвета, когда вы нарисуете прямоугольник greenSquare и наоборот.

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

+0

Это потрясающе, у меня было ощущение, что это что-то вроде этого. Я просто не понял, что именно. Это объяснение было действительно полезно для iOSer в первый раз, как и я. :) Однако решение rdelmar лучше, чем ваше. Поэтому я не уверен, кому я должен дать печенье с шоколадным чипом (галочкой)? @Andrew – GangstaGraham

+0

Я решил выбрать вас как победителя, но я дал вам обоим – GangstaGraham

3

Настройка cell.blueCircle на nil устанавливает указатель на нуль, но не удаляет синий символ. Поскольку синий круг является подзором ячейки, ячейка имеет сильный указатель на него. Вам нужно удалить его из своего супервизора.

[cell.blueCircle removeFromSuperview]; 
[cell.greenRect removeFromSuperview]; 
+0

Да, это сработало. :) Я действительно попробовал это, увидев ответ Эндрю, который помог мне понять, где я ошибся. Однако ваше решение лучше, чем его. Поэтому я не уверен, кому я должен дать печенье с шоколадным чипом (галочкой)? Возможно, усильте свое объяснение, чтобы конкурировать с Эндрю. @rdelmar – GangstaGraham

+0

@GangstaGraham, сообщение Эндрю на самом деле отвечает на ваш вопрос о том, как это может случиться, мое просто говорит вам, как его исправить, поэтому выберите, как вам нравится. – rdelmar

+0

Я решил выбрать Андрея в качестве победителя, потому что он помог мне лучше понять ситуацию, но я отдал вам обоих, плюс у вас уже есть ваша доля очков: P @rdelmar – GangstaGraham

Смежные вопросы