reloadRows(at:)


#1

Ребят следующая ситуация:

  • Есть UITableView с кастомными ячейками
  • В каждой кастомной ячейке есть по одному UITextField
  • На каждый UITextField назначен таргет для события “изменения значения содержимого UITextField”
  • Значения в UITextField’ах которые мы не фокусим динамически обновляются (подсасываются с API)
  • В момент когда мы кликаем на UITextField определенной ячейки и изменяем ее значение, происходит перезагрузка таблицы

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

Я попробовал воспользоваться self.tableView.indexPathsForVisibleRows чтобы получить indexPathы для видимых ячеек и уже отфильтровать нужную ячейку вручную с помощью reloadRows(at:) чтобы явно указать какие ячейки мне нужно обновлять, а какие нет.

Для первых 10 ячеек такой способ работает, однако когда я пролистываю тейблвью вниз, данный способ работать перестает (я подразумеваю что это из за переиспользования ячеек, но уже второй час не могу понять что делаю не так)

Фрагмент кода прилагаю к сообщению

Если подскажете что делаю не так, буду очень благодарен!


#2

вы хотите сделать так чтобы при перезагруке tableView контент не дергался и все оставалось на своих местах?


#3

Да но именно в той ячейке где будет фокус на textField’е висеть

Сделал кстати следующим образом:

По сути берем массив indexPath по видимым ячейкам
Если массив пустой - Обновляем всю таблицу
Если массив непустой - проходим по каждому элементу массива и сравниваем его с тем indexPath для которого нам нужно обновление интерфейса
Как только находим совпадение такого элемента, удаляем его из массива indexPathsForVisibleRows
И обновляем таблицу по заданным indexPath

Данный метод вызываю ежесекундно при запросе к API, чтобы динамически менялись значения на новые во всех textField’ах всех видимых на экране ячеек.

Вроде работает, за исключением некоторых глитчей ))


#4

а если не сложно можешь видос сделать как интерфейс отрабатывает ?


#5

недавно с этим разбирался, когода задваивались чекмарки при пролистывании таблицы. Это не совсем решение вашей задачи, но причина скорее всего та же. А именно, если вы каким-то образом добавляете элементы форматирования к ячейкам, то они остаются при пролистывании, скроллинге таблицы. И тогда ячейка, которая уходит из видимого поля а затем заново появляется, начинает глючить. Метод dequeueReusableCell очищает только содержание, форматы нужно чистить отдельно.