Как удалить секцию в UITableView


#1

Всем привет! Продолжая темы Как достать значения из ячеек для viewForHeaderInSection и Передать значение в массив для tableView , у меня есть вопрос про удаление секций в tableView. Секции строятся в зависимости от магазина. Итого, в нашей “корзине” есть товар, распределенный по секциям.
Встал вопрос как удалять секции? Для удаления ячейки:

    let deletedOffer = self.purchasesViewModel[indexPath.section].offers!.remove(at: indexPath.row)
    dataSource.setCount(count: 0, buttonType: .delete, id: deletedOffer.id!, isBought: deletedOffer.isBought!)
    self.tableView.deleteRows(at: [indexPath], with: .left)

Метод setCount - это .POST запрос на удаление с БД сервера одного “Offer”. Там все отрабатывает как надо. Собственно, ячейка также удаляется как надо. Только единственный момент - мне необходимо использовать tableView.reloadData(), так как в section header есть информация по суммарной цене и ее тоже надо обновить. Но анимация удаления сразу же становится какой-то “кривой”. Она дёрганная. Может, есть какой-то вариант это исправить?
Но, это вторично. Главный момент -

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

    if purchasesViewModel[indexPath.section].offers?.count == 1 {
        self.purchasesViewModel[indexPath.section].offers!.remove(at: indexPath.row)
        self.purchasesViewModel.remove(at: indexPath.section)
        let indexSet = IndexSet(arrayLiteral: indexPath.section)
        tableView.deleteSections(indexSet, with: .left)
        self.tableView.reloadData()
    }

Как правильно удалять секцию?
На StackOverflow нашел, что при использовании метода remove(at: Int), нужно писать at: indexPath.section - 1. Но если я так сделаю, то выдаст ошибку Index out of range.

Все это я делаю в методе func tableView( _ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath)


#2

Вопрос решен. Разобрался, я тупанул :slight_smile:

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        
        if purchasesViewModel[indexPath.section].offers!.count == 1 {
            self.purchasesViewModel[indexPath.section].offers!.remove(at: indexPath.row)
            self.purchasesViewModel.remove(at: indexPath.section)
            let indexSet = IndexSet(arrayLiteral: indexPath.section)
            tableView.deleteSections(indexSet, with: .left)
        } else {
            let deletedOffer = self.purchasesViewModel[indexPath.section].offers!.remove(at: indexPath.row)
            dataSource.setCount(count: 0, buttonType: .delete, id: deletedOffer.id!, isBought: deletedOffer.isBought!)
            self.tableView.deleteRows(at: [indexPath], with: .left)
            tableView.reloadSections(indexSet, with: .automatic)
        }
    }
}

#3

Остался только вторичный вопрос - дёрганная анимация, если юзать tableView.reloadData()


#4
let deletedOffer = self.purchasesViewModel[indexPath.section].offers!.remove(at: indexPath.row)
if purchasesViewModel[indexPath.section].offers!.count == 1 {
    self.purchasesViewModel.remove(at: indexPath.section)
    let indexSet = IndexSet(arrayLiteral: indexPath.section)
    tableView.deleteSections(indexSet, with: .left)
} else {
    dataSource.setCount(count: 0, buttonType: .delete, id: deletedOffer.id!, isBought: deletedOffer.isBought!)
    self.tableView.deleteRows(at: [indexPath], with: .left)
}
self.tableView.beginAnimations()
self.tableView.reloadData()
self.tableView.stopAnimations()

попробуйте как-то так


#5

Все равно подтормаживает.
Обновил верхнее сообщение, добавил методы другие.