UITableView dequeueReusableCellWithIdentifier: возвращает ноль - PullRequest
1 голос
/ 20 декабря 2011

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

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

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

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

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

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

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

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

1 Ответ

4 голосов
/ 20 декабря 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...