tableview commit editingStyle 正在删除错误的条目
Posted
技术标签:
【中文标题】tableview commit editingStyle 正在删除错误的条目【英文标题】:tableview commit editingStyle is removing the wrong entry 【发布时间】:2018-05-28 15:21:49 【问题描述】:以下代码删除了错误的条目。我有一个显示事件列表的数组。在调试器中 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)")
【问题讨论】:
与您的问题无关,但不恰当地使用一个很好的guard
语句并安全地使用 as?
但也滥用 !
运算符并强制解开可选的 eventsOnArray
.它只是破坏了整个目的。将!
替换为?
。
好的...已更改。谢谢
【参考方案1】:
我这里的猜测是你的数据源的顺序和我们看到的代码中使用的数组不一样。
我基于您调用 events?.allObjects
的事实,这表明 events 是一个无序的 NSSet,并且在其上调用 allObjects 会为您提供一个未定义顺序的数组。您需要有一个数组而不是一个集合,这样您就可以通过代码的不同部分保证对象的相同排序顺序。
【讨论】:
【参考方案2】:除了@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 []
这假设您的 Event
实体中有一个 title
属性,因此该数组返回按标题排序的所有事件。根据需要修改sorted
闭包。
【讨论】:
以上是关于tableview commit editingStyle 正在删除错误的条目的主要内容,如果未能解决你的问题,请参考以下文章