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:
Запрашивает источник данных для ячейки для вставки в определенном месте табличного представления.
С другой стороны, willDisplay можно использовать для переопределения определенных свойств ячейки непосредственно перед ее отображением для просмотра. Я бы посоветовал, если вы не уверены в willDisplay, просто сделайте все настройки в cellForRowAt.
Документ Apple говорит о willDisplay:
Этот метод дает делегату возможность переопределять основанные на состоянии свойства, установленные ранее табличным представлением, такие как выделение и цвет фона.
Подробнее о willDisplay можно узнать из документации Apple: tableView: willDisplayCell: forRowAtIndexPath:
РЕДАКТИРОВАТЬ: После прочтения ссылки, которую вы предоставили - я подтверждаю, что если у вас нет особых причин для настройки ячейки в willDisplayCell, просто сделайте это в cellForRowAt.