我试图删除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的第一个单元格时,它将导致另一个错误。谢谢,请帮助我修复此错误。
答案 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]
移动到删除行的代码上方