Индекс вне диапазона при удалении последней ячейки в UITableView - PullRequest
0 голосов
/ 25 октября 2018

Я пытался удалить ячейку в TableView, все работает нормально, пока я не удалил последнюю ячейку, и я получил ошибку: «Поток 1: Неустранимая ошибка: Индекс выходит за пределы диапазона».

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    guard editingStyle == .delete else {return}
    classList.remove(at: indexPath.row)
    tableView.deleteRows(at: [indexPath], with: .fade)
    let subject = classList[indexPath.row]
    PersistenceService.context.delete(subject)
    PersistenceService.saveContext()

    let fetchRequest: NSFetchRequest<Class> = Class.fetchRequest()
    do {
        let classList = try PersistenceService.context.fetch(fetchRequest)
        self.classList = classList
    } catch {}
    self.tableView.reloadData()
    print("Delete \(subject)")
}

Затем я попытался позволить subject = classList [indexPath.row-1], что решит ошибку удаления последней ячейки, но это вызывает другую ошибку, когда я пытаюсь удалить первую ячейкуTableView.Пожалуйста, помогите мне исправить эту ошибку, спасибо.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Проблема в том, что вы удаляете элемент из classList, а затем пытаетесь получить к нему доступ.

classList.remove(at: indexPath.row)
...
let subject = classList[indexPath.row]

переместите let subject = classList[indexPath.row] над кодом, в котором вы удаляете строку

0 голосов
/ 25 октября 2018

После удаления объекта из classList количество элементов изменяется так, что позже classList[indexPath.row] падает, потому что индекс больше не существует.

Вам необходимо изменить порядок

let subject = classList[indexPath.row]
classList.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)
PersistenceService.context.delete(subject)
PersistenceService.saveContext()

и удалите этот код:

let fetchRequest: NSFetchRequest<Class> = Class.fetchRequest()
do {
    let classList = try PersistenceService.context.fetch(fetchRequest)
    self.classList = classList
} catch {}
self.tableView.reloadData()

Это бессмысленно, вам не нужно повторно загружать данные.

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