我已关注this tutorial并成功将我的 NSTableView
绑定(bind)到核心数据实体。
该表是一个基于 View 的单元格,并由核心数据实体完美填充。
我将 +
和 -
按钮绑定(bind)到 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)
}
我使表格 View 单元格可编辑。当按下加号按钮时,将创建一个新条目,并显示在表格上,并带有文本“新条目”。这个新条目创建了一个核心数据记录。我们将其称为记录 1
。
现在我希望用户使用他们想要的名称编辑条目。
所以我选择新单元格并按 Enter 键。该单元格现在处于编辑模式。 我在该单元格中输入我想要的新名称,该名称将传递到核心数据实体。
例如,我键入 BONOBO 并按 ENTER。
该表必须仅包含唯一的名称。因此,一旦按下 ENTER 并且单元格结束编辑,我想检查核心数据以查看名称 BONOBO 是否已被占用,如果是,则拒绝该名称并告诉用户提供新名称。
这就是问题所在:只要我按下 ENTER,record 1
就会立即将其名称从 New Entry
更改为 BONOBO
,然后再可以检查该条目是否已存在于数据库中,这意味着我所做的任何检查都会告诉我该记录存在。事实上,该记录存在于内存中,因为上下文尚未保存。
我通过将所有单元格的委托(delegate)设置为一个类并使用其委托(delegate)方法 controlTextDidEndEditing(_ obj: Notification)
来拦截 Enter 按下。
我也尝试为文本字段设置操作,但问题是相同的。
如何在核心数据发生变化之前拦截它?
最佳答案
这里的技巧是利用键值编码的内置验证方法。请参阅Object Validation .
我从未使用托管对象执行过此操作,但该过程似乎与常规 KVC 验证相同。您想要实现一个名为:
的方法validate<Key>:error:
... 其中“Key”是您尝试验证的参数的名称。它接收一个指向您要验证的值的指针,另一个指向 NSError 对象。在方法内部,您测试传入的值是否可接受。您可以返回 true 来接受它,修改值并返回 true 来接受修订版本,或者返回 false 来彻底拒绝它(修改错误对象以将某些内容发送回用户)。
关于macos - Tableview 更新暮色区域中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57173725/