以下代码正在删除错误的条目。我有一个显示事件列表的数组。在调试器中,indexPath.row显示1(这是我选择删除的条目。但是当视图刷新时,它删除了条目4。
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)")
}
}
答案 0 :(得分:1)
我的猜测是,您的数据源的顺序与您在我们看到的代码中使用的数组不同。
我的基础是你调用events?.allObjects
,这表明事件是一个无序的NSSet,并且在它上面调用allObjects会给你一个带有未定义顺序的数组。您需要有一个数组而不是一个数组,这样您就可以通过代码的不同部分保证对象的排序顺序相同。
答案 1 :(得分:0)
添加到@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
实体中存在Event
属性,因此数组返回按标题排序的所有事件。根据您的需要修改sorted
关闭。