Как я могу исправить это Неверное обновление: неверное количество строк в разделе 0 ошибка? - PullRequest
0 голосов
/ 19 июня 2019

Я экспериментирую с / 1001 * в Swift 5.

Я хочу вставить и удалить строки.

Моя таблица падает при добавлении дополнительных строк.Первая вставка работает нормально.

class ViewController: UITableViewController {

    var items = [Int]()

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.backgroundColor = .white
        tableView.tableFooterView = UIView()
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "CELL_ID")

        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            self.addMoreRows([1,2,3,4,5])
        }

        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            self.addMoreRows([6,7,8,9,10])
        }

    }

    private func addMoreRows(_ data: [Int]) {

        self.items.append(contentsOf: data)

        var indexPaths = [IndexPath]()

        for i in 0...items.count - 1 {
            indexPaths.append(IndexPath(row: i, section: 0))
        }

        tableView.insertRows(at: indexPaths, with: .left)
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CELL_ID", for: indexPath)
        cell.textLabel?.text = "Cell #\(indexPath.row)"
        return cell
    }
}

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

Ответы [ 3 ]

2 голосов
/ 19 июня 2019

Ваш цикл для создания массива путей индекса неверен. Вы хотите, чтобы оно повторялось по data.count, а не items.count. И вы хотите, чтобы новые пути индекса основывались на предыдущем items.count.

private func addMoreRows(_ data: [Int]) {
    var indexPaths = [IndexPath]()

    for i in data.indices() {
        indexPaths.append(IndexPath(row: items.count + i, section: 0))
    }

    self.items.append(contentsOf: data)

    tableView.insertRows(at: indexPaths, with: .left)
}
0 голосов
/ 19 июня 2019

В addMoreRows пути индекса всегда начинаются с 0, поэтому во втором вызове создаются пути индекса 10.

Более надежным способом является подсчет элементов до и после вставки

private func addMoreRows(_ data: [Int]) {
    let startIndex = self.items.count
    self.items.append(contentsOf: data)
    let endIndex = self.items.count

    var indexPaths = [IndexPath]()

    for i in startIndex..<endIndex {
        indexPaths.append(IndexPath(row: i, section: 0))
    }

    tableView.insertRows(at: indexPaths, with: .left)
}
0 голосов
/ 19 июня 2019

Я думаю, вам нужно добавить к items после того, как вы вычислите коллекцию IndexPath.

Вы также должны использовать диапазон для поддержки следующей итерации.

Попробуйте это:

private func addMoreRows(_ data: [Int]) {

    var indexPaths = [IndexPath]()

    for i in items.count...items.count + data.count - 1 {
        indexPaths.append(IndexPath(row: i, section: 0))
    }

    self.items.append(contentsOf: data)

    tableView.insertRows(at: indexPaths, with: .left)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...