Какой метод используется для переиспользования ячейки в UITableView
Что проверяют
Метод назовут все, поэтому смотрят на механику: откуда берётся ячейка, когда она создаётся и что с ней нужно сделать перед повторным показом. Следом обычно спрашивают про prepareForReuse() и про то, почему при прокрутке «перепутались» картинки.
Как отвечать
Основной метод dequeueReusableCell(withIdentifier:for:). Таблица держит пул ячеек, ушедших за край экрана, и по идентификатору отдаёт одну из них. Если свободной нет, создаёт новую по зарегистрированному классу или nib. Поэтому ячеек в памяти примерно столько, сколько помещается на экране, плюс небольшой запас, а не по одной на строку.
Порядок работы:
- регистрация:
register(_:forCellReuseIdentifier:)с классом илиUINib, либо прототип в сториборде с тем же идентификатором; - получение: в
tableView(_:cellForRowAt:)вызываете dequeue и приводите тип черезguard let ... as?илиas!; - настройка: заполняете ячейку полностью, потому что она приходит со старыми данными.
Разница двух вариантов: старый dequeueReusableCell(withIdentifier:) без indexPath возвращает опционал, и при nil ячейку создают руками. Версия с for: всегда возвращает ячейку, но падает, если идентификатор не зарегистрирован.
prepareForReuse() вызывается перед повторной выдачей. Apple советует сбрасывать там только то, что не относится к контенту: выделение, прозрачность, режим редактирования, плюс отменять начатую загрузку. Сам контент выставляется в cellForRowAt.
В новом коде списки часто строят на UICollectionView с UICollectionView.CellRegistration, принцип переиспользования там тот же.
Где спотыкаются
Настраивают ячейку частично: если в одной ветке if картинку ставят, а в другой не сбрасывают, при прокрутке появляются чужие данные.
Запускают асинхронную загрузку картинки и по завершении кладут её в ячейку, не проверив, что ячейка всё ещё показывает ту же строку. Нужно сверять идентификатор модели или отменять задачу в prepareForReuse().
Создают UITableViewCell(style:reuseIdentifier:) в каждом вызове cellForRowAt, вообще без dequeue. Переиспользования нет, и прокрутка длинного списка начинает дёргаться.