Сбой UITableView при одновременном удалении строк, удалении разделов и перезагрузке строк с использованием executeBatchUpdates - PullRequest
1 голос
/ 18 февраля 2020

Я пытаюсь удалить строки, удалить разделы и перезагрузить строки одновременно. Я сделал простое приложение, чтобы продемонстрировать мой cra sh. Начинается с 3 разделов. Когда вызывается buttonPressed, разделы 0 и 1 удаляются из data, затем вызывается performBatchUpdates для обновления представления таблицы.

class ViewController: UIViewController {

    @IBOutlet var tableView: UITableView!

    var data: [[String]] = [
        ["0-0"],
        ["1-0"],
        ["2-0",
         "2-1",
         "2-2"],
    ]

    @IBAction func buttonPressed(_ sender: UIButton) {
        data = [
            ["2-0 new",
             "2-1 new",
             "2-2 new"],
        ]

        tableView.performBatchUpdates({
            self.tableView.deleteRows(at: [
                  IndexPath(row: 0, section: 0),
                  IndexPath(row: 0, section: 1),
              ], with: .automatic)

            self.tableView.reloadRows(at: [
                IndexPath(row: 0, section: 2),
                IndexPath(row: 1, section: 2),
                IndexPath(row: 2, section: 2),
            ], with: .automatic)

            self.tableView.deleteSections(IndexSet([0, 1]), with: .automatic)

        }, completion: nil)
    }
}

extension ViewController: UITableViewDelegate, UITableViewDataSource {
    func numberOfSections(in tableView: UITableView) -> Int {
        return data.count
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data[section].count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.text = data[indexPath.section][indexPath.row]
        return cell
    }
}

Я получаю следующее исключение учета строк / разделов, но Я не понимаю, откуда взялись некоторые числа:

Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Неверное обновление: недопустимое количество строк в разделе 0. Число количество строк, содержащихся в существующем разделе после обновления (3), должно быть равно количеству строк, содержащихся в этом разделе до обновления (3), плюс или минус количество строк, вставленных или удаленных из этого раздела (2 вставлено, 3 удалено) ) и плюс или минус количество строк, перемещенных в этот раздел или из него (0 перемещено, 0 перемещено). '

...