У меня проблема со сбоем в приложении (из-за которого я не смог воссоздать, но у меня есть сообщение об ошибке). Я думаю, что я знаю общую область, которая вызывает это, но не могу точно определить это. Точное сообщение о сбое выглядит следующим образом:
Неустранимое исключение: 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.
Есть ли что-то, что выглядит не так, как будто это может вызвать такую ошибку? Может быть, указатель в правильном направлении? Что обычно исправляет эта ошибка?