Почему содержимое 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 дергается: пример фильма

Зачем? Как это исправить?

0 ответов