Почему содержимое UITableView дергается при вставке / удалении строк?
Я разрабатываю экран с помощью TableView с двумя типами ячеек: ячейка "Одна запись" и ячейка "Группы записей". "Одиночный" один прост - его вид на модель представления входа. Ячейка "Групповые записи" должна показывать информацию о количестве записей и должна иметь возможность показать / скрыть эту подробную информацию. Я решил это так: когда пользователь щелкает ячейку "Группа" - я вызываю один из методов: openGroup или closeGroup зависит от параметра isOpen, в эти функции я вставляю или удаляю "одиночные" строки в TableView прямо под " Группа "Клетка":
public func addRows(_ entries: [HistoryViewModelProtocol], at indexPaths: [IndexPath]) {
for i in 0..<entries.count {
let entry = entries[i]
let indexPath = indexPaths[i]
self.sections[indexPath.section].items.insert(entry, at: indexPath.row)
}
self.tableView.beginUpdates()
self.tableView.insertRows(at: indexPaths, with: self.animation)
self.tableView.endUpdates()
}
public func removeRows(_ rows: Range<Int>, in section: Int) {
let indexPaths = rows.compactMap({ IndexPath(row: $0, section: section) })
self.sections[section].items.removeSubrange(rows)
self.tableView.beginUpdates()
self.tableView.deleteRows(at: indexPaths, with: self.animation)
self.tableView.endUpdates()
}
func openGroup(at indexPath: IndexPath) {
guard let group = self.sections[indexPath.section].items[indexPath.row] as? HistoryGroupViewModel else {
return
}
for i in 0..<group.items.count {
let entry = group.items[i]
let newIndexPath = IndexPath(row: indexPath.row + i + 1, section: indexPath.section)
self.addRows([entry], at: [newIndexPath])
}
}
func closeGroup(at indexPath: IndexPath) {
guard let group = self.sections[indexPath.section].items[indexPath.row] as? HistoryGroupViewModel else {
return
}
let rows = CountableRange(uncheckedBounds: (lower: indexPath.row + 1, upper: indexPath.row + 1 + group.items.count))
removeRows(rows, in: indexPath.section)
}
Но есть проблема - когда я вставляю или удаляю строки, все содержимое TableView дергается: пример фильма
Зачем? Как это исправить?