tableview commit editingStyle正在删除错误的条目

时间:2018-05-28 15:21:49

标签: ios swift uitableview core-data

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

}

2 个答案:

答案 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关闭。