Ios tableview提交编辑样式正在删除错误的条目
以下代码正在删除错误的条目。我有一个显示事件列表的数组。在调试器中,indexPath.row显示1,这是我选择删除的条目。但是,当视图刷新时,它已删除条目4Ios tableview提交编辑样式正在删除错误的条目,ios,swift,uitableview,core-data,Ios,Swift,Uitableview,Core Data,以下代码正在删除错误的条目。我有一个显示事件列表的数组。在调试器中,indexPath.row显示1,这是我选择删除的条目。但是,当视图刷新时,它已删除条目4 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath)
func tableView(_ tableView: UITableView,
commit editingStyle: UITableViewCellEditingStyle,
forRowAt indexPath: IndexPath) {
print(type(of: selectedRecipient))
var eventsOnArray = selectedRecipient?.events?.allObjects
guard let event = eventsOnArray?[indexPath.row] as? Event, editingStyle == .delete else {
return
}
managedContext.delete(event)
do {
try managedContext.save()
print("Deleted")
eventsOnArray?.remove(at: indexPath.row)
getEvents()
self.eventList.reloadData()
} catch let error as NSError {
print("Saving error: \(error), description: \(error.userInfo)")
}
}
我的猜测是,数据源的顺序与我们看到的代码中使用的数组不同
我这样做是基于这样一个事实,即您调用events?.allObjects,这表明events是一个无序的NSSet,对其调用allObjects会得到一个顺序未定义的数组。您需要一个数组而不是集合,这样您就可以通过代码的不同部分保证对象的排序顺序相同。添加到@Joakim Danielson的答案中,您可以为实体添加一个扩展,以提供数组而不是集合,如下所示:
extension Recipient {
var eventsArray: [Event] {
get {
if let eventSet = events as? Set<Event> {
return eventSet.sorted { (item0, item1) -> Bool in
return item0.title < item1.title
}
}
return []
}
}
}
这假设事件实体中有一个title属性,因此数组返回按title排序的所有事件。根据您的需要修改已排序的闭包。与您的问题无关,但使用as的安全性好的保护声明是不合适的?但也要误用!操作员和强制展开可选的EventSonaray。这完全违背了目的。换新的!是吗?好的。。。改变。谢谢