我有一个表格视图,我正在使用CoreData中的实体填充。问题是当我尝试从表视图中删除实体时。 CoreData似乎正在删除并保存更新,但是有一个错误并且抛出了2个警告。错误似乎来自这一行
tableView.deleteRowsAtIndexPaths([indexPath],withRowAnimation: UITableViewRowAnimation.Automatic)
这就是错误所说的:
由于未捕获的异常而终止应用 ' NSInternalInconsistencyException',原因:'无效更新:无效 第0节中的行数。包含在中的行数 更新后的现有部分(4)必须等于数量 更新(4)之前该部分中包含的行,加号或减号 从该部分插入或删除的行数(插入0, 删除1)加上或减去移入或移出的行数 该部分(0移入,0移出)。
我看到的2个警告如下:
在尝试'尝试'表达
'抓'阻止无法访问,因为没有错误在' do' 块。
以下是调用此代码的函数:
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle,forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == UITableViewCellEditingStyle.Delete {
//1
let personToRemove = persons![indexPath.row]
print(personToRemove)
print(indexPath.row)
//2
coreDataStack.context.deleteObject(personToRemove)
//3
do {
try! coreDataStack.saveContext()
} catch let error as NSError {
print("Could not save: \(error)")
}
//4
tableView.deleteRowsAtIndexPaths([indexPath],withRowAnimation: UITableViewRowAnimation.Automatic)
}
}
当我评论出来以确定故障的位置时,它似乎是最后一行。它似乎在抱怨行数,所以在删除行时,我可能会错过代码的关键部分。
谢谢!
答案 0 :(得分:1)
保存托管对象上下文的基础方法捕获错误,因此您可以安全地删除整个do - catch
块。
要删除项目,您必须将其从表格视图数据源以及Core Data堆栈中删除。
我建议使用此订单
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle,forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == UITableViewCellEditingStyle.Delete {
//1
let personToRemove = persons![indexPath.row]
persons.removeAtIndex(indexPath.row)
//4
tableView.deleteRowsAtIndexPaths([indexPath],withRowAnimation: UITableViewRowAnimation.Automatic)
//2
coreDataStack.context.deleteObject(personToRemove)
//3
coreDataStack.saveContext()
}
}
我建议进一步将persons
声明为非可选。