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 正在删除错误的条目的主要内容,如果未能解决你的问题,请参考以下文章

如何修改Git commit的信息

git 交互式变基 - 编辑与中断

Git修改已提交的commit注释

TableView 没有响应 UINavigationController 中的“编辑”按钮

将“编辑”发送到 tableview(单独的视图)

Git点滴记录