heightForRowAtIndexPath не вызывается после TableView.beginUpdates в ios 15

#ios #swift #ios15

Вопрос:

До iOS 15 после того, как я сделал

 self.tableView.beginUpdates()
self.tableView.endUpdates()
 

был вызван метод heightForRowAtIndexPath, и высота моей ячейки изменилась без перезагрузки данных в ячейке. Теперь в iOS 15 это не работает! Как я могу принудительно перезагрузить высоту ячейки tableview без перезагрузки данных в этой ячейке?

Комментарии:

1. Абсолютно та же проблема. Нашел его всего несколько минут назад. Временно замените beginUpdated() и endUpdates() на reloadData (), пока я не найду решение

2. Вам потребуется предоставить дополнительную информацию о своем коде. Быстрый тест, и он работает, как и ожидалось, для меня.

3. Примечание сбоку… В документах Apple говорится: «Используйте этот performBatchUpdates(_:completion:) метод вместо этого, когда это возможно».

4. @DonMag , performBatchUpdates(_:завершение:) также не работает

5. У меня еще нет устройства, обновленного до iOS 15, но это отлично работает на симуляторе iPhone: pastebin.com/PgWPN6QX

Ответ №1:

Я уже решил эту проблему. По-видимому, Apple изменила способ обработки обновлений и настройки размеров ячеек.

Поскольку «скрытая» ячейка остается на 0, при отправке beginUpdate она обрабатывает только те ячейки , значение которых больше 0, поэтому она больше не корректирует их.

Что вам нужно сделать, так это изменить значение 0, возвращаемое для скрытых ячеек, на 0,01, и все готово!

Я надеюсь, что это решение сработает так же и для меня.

Ответ №2:

Нашел решение:

  1. В методе heightForRowAtIndexPath возвращает размер ячейки UITableView.automaticDimension вместо размера
  2. Внутри моей пользовательской ячейки TableView я добавил ограничение по высоте в представление контейнера (в моем случае это WebView).
  3. В месте, где я получаю размер ячейки и мне нужно обновить высоту (для меня после загрузки содержимого WebView), я обновляю противопоказание по высоте:

.

 cell.heightContraint.constant = size
self.tableView.beginUpdates()
self.tableView.endUpdates()
 

Таким образом, ячейка теперь авторезизуема с помощью UITableView.Высота автоматического размера и, конечно, ваш вид/представление контейнера должны иметь ограничения сверху и снизу, равные ограничениям сверху и снизу ячейки