Ios tableview提交编辑样式正在删除错误的条目

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

以下代码正在删除错误的条目。我有一个显示事件列表的数组。在调试器中,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)")
        }

}

我的猜测是,数据源的顺序与我们看到的代码中使用的数组不同


我这样做是基于这样一个事实,即您调用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。这完全违背了目的。换新的!是吗?好的。。。改变。谢谢