Табличное представление движется вверх и вниз, как прыжки непрерывно - PullRequest
1 голос
/ 19 июня 2019

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

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

Например.: Представление таблицы

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

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

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

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

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 19 июня 2019

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

0 голосов
/ 19 июня 2019

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

0 голосов
/ 19 июня 2019

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

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

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

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

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

...