2010-09-24 2 views
0

У меня есть сгруппированный UITableView в моем классе UIViewController, и я нахожу, что время от времени выделенная ячейка не равна нулю.UITableView cellForRowAtIndexPath ячейка не равна нулю, если ожидается

В таблице есть 3 раздела для начала и, и как только вызывается «viewDidLoad», инициируется вызов сервера, чтобы узнать, есть ли больше разделов. Перед тем, как представление будет даже отображаться, появится ответ сервера, и нам сказали, что у нас есть 4 раздела. Чтобы справиться с этим изменением, я делаю:

[self.tableview beginUpdates] 

// Do the updating of the array that holds table data 

[self.tableview endUpdates] 
[self.tableview reloadData]; 

Далее я получаю вызов «numberOfSectionsInTableView», для которого я возвращаюсь 4, а затем «numberOfRowsInSection» и я возвращаюсь ожидаемые правильное количество строк. Обратите внимание, что это первый раз, когда я получаю любой из этих вызовов, так как перезагрузка таблицы происходила так быстро и до того, как представление было даже отображено.

На данный момент видны только данные из 1-го 3-х секций и прокрутите, чтобы просмотреть последний раздел. Когда вы прокрутите страницу до последнего раздела, одна из ячеек, которую я ожидаю в вызове tableView: cellForRowAtIndexPath, не является нулевой, как ожидалось. Тип ячейки - это то, что было использовано для другого раздела (у меня есть один тип UITableViewCell для первых двух разделов, а другой для последних двух разделов, которые я создаю и передаю обратно в cellForRowAtIndexPath, когда ячейка равна нулю).

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

ответ

2

Что вы используете для определения вашей ячейки? Это то, что будет использовать UITableView при определении того, что нужно удалить. Если у вас разные типы ячеек, вам понадобятся разные идентификаторы повторного использования.

+0

В этом была проблема. Я думал, что вся таблица должна иметь один и тот же идентификатор ячейки. –

2

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

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

Естественным дополнением к этому является идентификаторы повторного использования nil. Они сообщают табличному представлению, что не должны их повторно использовать, освобождая их, когда они больше не отображаются на экране. Зачем вам это нужно? Для уникальных ячеек или для клеток, которыми вы управляете сами, или для клеток, которые имеют нетипичный жизненный цикл, или чрезвычайно дороги для рисования. Тем не менее, чем меньше неисправимых ячеек у вас есть, тем ниже объем памяти.

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