Swift Неверное обновление с использованием insertRow в UITableView - PullRequest
1 голос
/ 22 сентября 2019

Я закончил с этим.Я использую асинхронную функцию для загрузки данных с servevr

        APIManager.loadBlocks(block_name: block_name, offset: indexPath.row + 1) { ( blocks, error) in
            if error == nil {
                DispatchQueue.main.async {
                    tableView.beginUpdates()
                    self.currentBlock.items.append(contentsOf: blocks![0].items)
                    tableView.insertRows(at: [IndexPath(row: self.currentBlock.items.count - 1, section: 0)], with: .automatic)
                    tableView.endUpdates()
                    spinner.stopAnimating()
                    tableView.tableFooterView?.isHidden = true
                }
            }
        }

И у меня есть

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

Я проверил счетчик currentBlock.items до и после завершения loadBlocks.Это правильно: 10 до, 20 после.Но почему 10 добавленных элементов считается как 1 - вставлено в вывод ошибки?

Я пробовал только с tableView.reloadData () - это работает, но мне нужна нормальная анимация вставки.

Также я пробовал

for item in blocks![0].items {
self.currentBlock.items.append(item)
}

или

self.currentBlock.items.insert(item, at: index)

Все еще не работает

1 Ответ

1 голос
/ 22 сентября 2019

Похоже, вы вставляете только 1 строку, но вы добавляете 10 элементов к вашей модели с помощью append(contentsOf:).

Вы должны вставить то же количество строк, что и при добавлении моделей.Индексы для вставки строк:

self.currentBlock.items.count
self.currentBlock.items.count + 1
self.currentBlock.items.count + 2
self.currentBlock.items.count + 3
...
self.currentBlock.items.count + blocks![0].items.count - 1

(обратите внимание, что self.currentBlock.items.count - это значение до вставки новых моделей)

Вы можете создать массив путей индекса, содержащихВыше строки, подобные этой:

let indexPathsToInsertRows = (0..<blocks![0].items.count).map { 
    IndexPath(row: self.currentBlock.items.count + $0, section: 0)
}

И затем вы можете вставить новые модели, как вы делали это раньше:

self.currentBlock.items.append(contentsOf: blocks![0].items)

И вставить строки в индексные пути, которые мы только что рассчитали:

tableView.insertRows(at: indexPathsToInsertRows, with: .automatic)
...