Вид таблицы перемещается вверх и вниз, как непрерывно прыгая

Я работаю над проектом, который находится в Objective C, а версия Xcode — 10.1. В этом проекте я использую socket. В этом приложении я постоянно читаю данные из Socket. И я показываю обновленное значение в виде таблицы. Для этого я перезагружаю заголовок раздела таблицы так же быстро, как данные поступают из сокета. Означает, что если я получу id = 5, я попытаюсь найти индекс раздела, чей id == 5, и я буду обновлять только этот раздел.

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

Для экс. : Представление таблицы

Случай 1: (Прокрутка работает отлично)

  • Заголовок раздела 1 (когда я нажимаю на заголовок 1, появляется строка 1)
  • Заголовок раздела 2
  • Заголовок раздела 3
  • Заголовок раздела 4
  • Заголовок раздела 5

Случай 2: (Прокрутка приведет к прыжкам заголовков)

  • Section Header 1 (When I click on Header 1, Row 1 will be removed)
    • Row 1
  • Заголовок раздела 2
  • Заголовок раздела 3
  • Заголовок раздела 4
  • Заголовок раздела 5

Таким образом, в приведенной выше структуре, когда мы нажимаем на заголовок 1, а затем прокручиваем вниз, в это время следующие заголовки прыгают из-за непрерывного процесса обновления.

Этот эффект прыгающего заголовка в прокрутке отсутствует в сценарии Case 1. Это произошло только в случае 2.

Эта проблема не возникала, когда я перезагружала всю таблицу вместо перезагрузки только одного заголовка раздела за раз. Пожалуйста, помогите мне в этом вопросе. Заранее благодарю.

Я попытался перезагрузить заголовок раздела, как указано ниже. [tableView beginUpdates]; [tableView reloadSections:[NSIndexSet indexSetWithIndex:i] withRowAnimation:UITableViewRowAnimationNone]; [tableView endUpdates];


person Jaykar Parmar    schedule 19.06.2019    source источник


Ответы (3)


Если вы используете метод «heightForRowAtIndexPath:» для вычисления высоты. Также используйте этот метод "estimatedHeightForRowAtIndexPath". Напишите код в методе высоты строки.

person phani    schedule 19.06.2019
comment
Большое спасибо @фани. это работает для меня. вы сделали мой день. :) - person Jaykar Parmar; 20.06.2019

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

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

Лучший способ справиться с таким сценарием — немного отложить обновления. Скажем с интервалом в 1 мин взять последнее обновление. Этого можно добиться с помощью RxSwift или реализовать собственную логику.

Затем, после того, как вы это сделаете, оптимизация, которую вы можете попробовать, состоит в том, чтобы обновить вид раздела самостоятельно, а не позволять UITableView делать это за вас. Это означает, что на основе текущего состояния UITableView найдите раздел, который вы хотите обновить данными, используйте indexPathsForVisibleRows и cellForRow(at indexPath: IndexPath), чтобы получить ячейку и напрямую обновить представление.

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

person kerry    schedule 19.06.2019
comment
Спасибо за ответ @kerry. В моем случае я показываю только заголовок раздела. Когда пользователь нажимает на заголовок раздела в любом индексе, ячейка будет видна только для этого индекса. Я пытался найти способ получить видимый заголовок раздела, но во всех решениях я обнаружил, что видимый раздел получается из видимой строки. [stackoverflow.com /вопросы/4191317/ - person Jaykar Parmar; 19.06.2019
comment
а вы обновляете строку? - person kerry; 19.06.2019
comment
Да, я тоже обновляю строку. - person Jaykar Parmar; 20.06.2019
comment
@JaykarParmar это не должно быть проблемой. Вы можете просто получить вид сечения, а также вид строки и обновить их на месте. - person kerry; 20.06.2019

Если вы перезагрузите раздел, все, что связано с этим разделом, будет перерисовано, включая номера строк, содержимое заголовков и поведение раздела по умолчанию (закрытый или развернутый). вам нужно изменить свой дизайн или ваш подход к требуемому решению - например, сделать таблицу незакрываемой (т.е. заголовок и дочерние элементы всегда видны) или другие вещи.

person GeneCode    schedule 19.06.2019