删除UITableView中的最后一个单元格时索引超出范围

时间:2018-10-25 08:41:57

标签: ios swift uitableview tableview

我试图删除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 :(得分:2)

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()

这毫无意义,您不需要重新获取数据。

答案 1 :(得分:2)

问题是您从classList中删除了一个项目,然后尝试访问它。

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

let subject = classList[indexPath.row]移动到删除行的代码上方