Math Not Adding Up - Ошибка удаления строки UITableView
Я получаю сообщение об ошибке при попытке удалить строку из UITableView
:
Вот данные для моего табличного представления:
var tmpArray = ["test"];
Вот как Table View получает количество строк:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return tmpArray.count;
}
Вот тело метода, который я вызываю для удаления строк:
self.tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic);
tmpArray.remove(at: 0);
Вот ошибка:
Завершение работы приложения из-за необработанного исключения "NSInternalInconsistencyException", причина: "Неверное обновление: недопустимое количество строк в разделе 0. Число строк, содержащихся в существующем разделе после обновления (1), должно быть равно количеству строк, содержащихся в этом раздел перед обновлением (1), плюс или минус количество строк, вставленных или удаленных из этого раздела (0 вставлено, 1 удалено) и плюс или минус количество строк, перемещенных в или из этого раздела (0 перемещено, 0 перемещено из).'
Странная часть состоит в том, что в разделе должна быть 1 строка перед удалением, а не 2.
Любые идеи относительно того, почему эта ошибка происходит?
Я просмотрел несколько постов, и, хотя и уместно, решение, представленное здесь, не работает: UITable View Ошибка удаления строки
Обновление Когда я вызываю команды удаления отдельно, ошибка все еще сохраняется:
tmpArray.remove(at: 0);
self.tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic);
Ошибка:
Завершение работы приложения из-за неперехваченного исключения "NSInternalInconsistencyException", причина: "Недопустимое обновление: недопустимое количество строк в разделе 0. Число строк, содержащихся в существующем разделе после обновления (0), должно быть равно количеству строк, содержащихся в этом раздел перед обновлением (0), плюс или минус количество строк, вставленных или удаленных из этого раздела (0 вставлено, 1 удалено) и плюс или минус количество строк, перемещенных в или из этого раздела (0 перемещено, 0 перемещено из).'
2 ответа
Вам действительно нужно использовать эту строку в вашем коде?
self.tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic);
Разве это не похоже на обновление источника данных и перезагрузку UITableView? Подобно:
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
//1. remove data from model
data.remove(at: indexPath.row)
//2. reload TableView
[tableView reloadData];
}
}
Или попробуйте это:
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
//1. remove data from model
data.remove(at: indexPath.row)
//2. remove row from view
tableView.deleteRows(at: [indexPath as IndexPath], with: .fade)
}
}
В func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath)
Ниже должны работать две строки, соблюдайте порядок звонков:
tmpArray.remove(at: indexPath.row)
self.tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic);
ИМХО... вызов reloadData() является более дорогим вызовом, но в конце шоу ваш вызов.