【发布时间】:2019-12-02 01:33:25
【问题描述】:
我已关注this tutorial 并成功将我的NSTableView 绑定到核心数据实体。
表格是一个基于视图的单元格,完全由核心数据实体填充。
我将+ 和- 按钮绑定到NSArrayController。当我按下加号按钮时,一条新记录被添加到核心数据并出现在表中,当我选择一个条目并按下减号时,该记录将从数据库中删除。就此而言,我已经为添加/删除键覆盖了此代码。
@IBAction override func add(_ sender: (Any)?) {
let newApp = self.newObject() as AnyObject
newApp.setValue("New Entry", forKey: "name")
self.addObject(newApp as Any)
}
@IBAction override func remove(_ sender: (Any)?) {
// Do certain stuff before removing all selected rows
self.remove(atArrangedObjectIndexes: self.tableView!.selectedRowIndexes)
}
我使表格视图单元格可编辑。当按下加号按钮时,会创建一个新条目并在表格中显示“新条目”文本。这个新条目创建了一个核心数据记录。我们就叫它record 1吧。
现在我希望用户使用他们想要的名称编辑条目。
所以我选择了新的单元格并按回车键。该单元格现在处于编辑模式。 我在该单元格中键入我想要的新名称,该名称将传递给核心数据实体。
例如,我键入 BONOBO,然后按 ENTER。
此表必须只包含唯一名称。因此,一旦按下 ENTER 并且单元格结束编辑,我想检查核心数据以查看名称 BONOBO 是否已被占用,如果是,则拒绝该名称并告诉用户提供一个新名称。
这是问题所在:当我按下 ENTER 时,record 1 立即将其名称从 New Entry 更改为 BONOBO,然后我才能检查数据库中是否已存在该条目,这意味着我所做的任何检查,总是会告诉我记录存在。事实上,该记录存在于内存中,因为尚未保存上下文。
我通过将所有单元格的委托设置为一个类并使用其委托方法controlTextDidEndEditing(_ obj: Notification)来拦截输入。
我也尝试为文本字段设置一个操作,但问题是一样的。
如何在核心数据发生变化之前进行拦截?
【问题讨论】:
标签: macos cocoa core-data nstableview nstablecellview