Swift - помощь в решении проблемы «Неправильное обновление: неверное количество строк в разделе 0» - особый случай - PullRequest
0 голосов
/ 08 октября 2019

У меня проблема со сбоем в приложении (из-за которого я не смог воссоздать, но у меня есть сообщение об ошибке). Я думаю, что я знаю общую область, которая вызывает это, но не могу точно определить это. Точное сообщение о сбое выглядит следующим образом:

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

Эта точная ошибка повторялась несколько разРазница между этой и другими подобными проблемами при переполнении стека заключается в том, что после обновления (удаления), которое вызывает проблему, кажется, что на 2 строки меньше, чем оригинал (10).

Для всех вопросов, которые я видел, было указано количество строк до и после, например, 5 строк до и 5 строк после удаления. Но в этом случае он уменьшается на 2 строки после 1 удаления.

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

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
     guard let section = self.sections?[indexPath.section],
     let product = section.products?[indexPath.row] else { return nil }
     let delete = UITableViewRowAction(style: .default, title: 
     "ActionText") { 
     [weak self] (action, indexPath) in
           self?.remove(product: product, in: section, at: indexPath)
     }
     return [delete]
}

func remove(product: BasketProduct, in section: BasketTableViewSection, at indexPath: IndexPath) {

    self.tableView.beginUpdates()
    guard let basket = self.basket, let index = 
    basket.products.firstIndex(where: { $0==product }) else { return }
    basket.products.remove(at: index)
    self.basket = basket

//Some code happens here that saves the changes to the data(basket) array 
// to a database but I won't show as it is unimportant.

    if section.products?.count == 1 {
        self.tableView.deleteSections(IndexSet(integer: 
        indexPath.section), with: .right)
    } else {
        tableView.deleteRows(at: [indexPath], with: .right)
    }

    self.updateBasket(reconfigureView: false) 
    { [weak self] in

        UIView.runOnMainThread {
             self?.tableView.endUpdates()
        }

}

*** определение «updateBasket» довольно длинное, поэтому было опущено. Стоит упомянуть, что в нем есть метод tableView.reloadData.

Есть ли что-то, что выглядит не так, как будто это может вызвать такую ​​ошибку? Может быть, указатель в правильном направлении? Что обычно исправляет эта ошибка?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...