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() является более дорогим вызовом, но в конце шоу ваш вызов.

Другие вопросы по тегам