UITableView cellForRowAt vs willDisplay

Я немного расстроен. У меня есть проект iOS 10 UITableView с UITableViewAutomaticDimension клетки. Я правильно установил ограничения.

Первоначально я картировал свои клетки внутри

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

и все работало нормально, но затем я прочитал статью: https://medium.com/ios-os-x-development/perfect-smooth-scrolling-in-uitableviews-fd609d5275a5 и перенес сопоставление данных в

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)

после этого мои ячейки автоматического размещения перестали работать должным образом.

Мое понимание того, что на высоте рассчитывается после cellForRowAt но прежде willDisplayпоэтому, когда я отображаю в willDisplay Высота уже установлена ​​для моей камеры, и мне нужно перезагрузить ее снова (что не очень хорошо).

Кто-нибудь может доказать / объяснить это?

ОБНОВИТЬ:

После публикации вопроса я нашел эту статью: https://tech.zalando.com/blog/proper-use-of-cellforrowatindexpath-and-willdisplaycell/

1 ответ

Решение

Всегда устанавливайте свою камеру внутри func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

В документации Apple говорится о cellForRowAt:

Запрашивает источник данных для ячейки для вставки в определенном месте табличного представления.

Tableview(_:cellForRowAt:)

С другой стороны, willDisplay можно использовать для переопределения определенных свойств ячейки непосредственно перед ее отображением для просмотра. Я бы посоветовал, если вы не уверены в willDisplay, просто сделайте все настройки в cellForRowAt.

Документ Apple говорит о willDisplay:

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

Подробнее о willDisplay можно узнать из документации Apple: tableView: willDisplayCell: forRowAtIndexPath:

РЕДАКТИРОВАТЬ: После прочтения ссылки, которую вы предоставили - я подтверждаю, что если у вас нет особых причин для настройки ячейки в willDisplayCell, просто сделайте это в cellForRowAt.

Другие вопросы по тегам