2011-12-20 4 views
1

У меня есть приложение с UITableView с различными пользовательскими UITableViewCells (и идентификаторами ячеек).UITableView dequeueReusableCellWithIdentifier: return nil

В моем реализованном tableView:cellForRowAtIndexPath: методе я использую dequeueReusableCellWithIdentifier: метод в UITableView и это дает мне UITableViewCell ожидаемого типа при вызове во время пользователь прокрутки таблицы, но, если я пытаюсь получить многоразовые клетки в других частях коды Я получаю нуль в результате, поэтому мне нужно создать новую ячейку.

Например, код у меня есть, что вставляет новые объекты, которые будут отображаться, выглядит следующим образом:

... 
[myDataSource addObject:newObject]; 
... 
[self.tv beginUpdates]; 
[self.tv insertRowsAtIndexPaths:paths withRowAnimation:rowAnimation]; 
[self.tv endUpdates]; 
... 

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

Должно ли это быть многоразовой ячейкой? В моем случае это может стать проблематичным, поскольку мои ячейки имеют несколько «тяжелый» метод init из-за их сложности.

Заранее спасибо

edit1: Просто чтобы прояснить, я хочу знать, почему нет неиспользуемых экземпляров ячейки в кэше таблицы для возврата, так как некоторые клетки (того же типа, что я вставив) просто бросить курить быть видимым?

+0

Это нормальное поведение, ячейка, которую вы вставляете, еще не существует, поэтому контроллер должен ее инициировать. –

+0

, но ячейка, которую я вставил, имеет тот же тип (и тот же идентификатор) ячейки, которая просто перестала быть видимой, теперь она должна быть повторно использована, не так ли? – ZeCodea

ответ

4

Для каждой используемой ячейки требуется собственный уникальный экземпляр. Когда вы прокручиваете таблицу, кеши iOS больше не используются, и это неиспользуемые экземпляры, которые возвращаются tableView:dequeueReusableCellWithIdentifier:. В вашем случае нет неиспользуемых экземпляров в кэше для возврата.

Что касается вашего метода init, вы не должны делать что-то много времени в нем. Например, если вы загружаете удаленный контент для отображения в ячейке, вы должны сделать это в фоновом режиме и обновлять таблицу/ячейку, когда она будет завершена.

+0

Да, я знаю, что я не должен занимать много времени в init. То, что я имел в виду с «тяжелым», было 10-15 imageViews, среди других элементов управления, плюс я могу добавить несколько объектов одновременно, поэтому вам нужно создать несколько экземпляров ячеек (поскольку они не удаляются), что может немного заморозить пользовательский интерфейс. Вопрос в том, «почему в кеш не возвращаются неиспользуемые экземпляры, поскольку некоторые ячейки просто перестают быть видимыми?» – ZeCodea

+1

точные данные о том, как UITableView управляет кешем, непрозрачны. У вас есть проблема с производительностью или вас беспокоит? Это не похоже на твою клеточную конструкцию. должно быть проблемой. создание/добавление subviews не представляет проблемы. не уверен, что вы подразумеваете под «созданием экземпляров нескольких ячеек». это целая цель таблицы. – XJones

+0

Если вы анимации во многих ячейках в 'indexPath', где все они будут отображаться, вы должны просто обновить dataSource и использовать' [tableView reloadData] '. – XJones

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