2012-06-15 2 views
11

У меня есть подкласс UITableViewController с его прототипными ячейками, расстроенными в раскадровке.Does dequeueReusableCellWithIdentifier: вызвать инициализатор в моем подклассе UITableViewCell?

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

Выполняет ли UITableViewController инициализатор в моем подклассе UITableViewCell, когда он берет ячейку прототипа из раскадровки? Я попробовал (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier, но это, похоже, не является частью процесса.

ответ

12

Когда экземпляр UITableView вызывает dequeueReusableTileWithIdentifier:, ячейка не повторно инициализируется. Вместо этого в этом вызове UITableViewCell, который был удален, вызовет -(void)prepareForReuse. Это связано с тем, что повторная инициализация ячейки является дорогостоящей, и если мы можем предоставить гораздо более простой способ для подготовки к ее повторному использованию (eh, eh, get it?), Это экономит массу работы ЦП.

Ergo, если вы используете пользовательские ячейки, переопределите UITableViewCell prepareForReuse.

10

Я, вероятно, не правильно сформулировал свой вопрос, но я искал здесь на самом деле (void)awakeFromNib.

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

+1

(vodi) awakeFromNib работает идеально для того, что вы хотите сделать только один раз, например, добавить распознаватель жестов в UILabel. –

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