我遵循本教程并成功地将NSTableView
绑定到核心数据实体。
该表是一个基于视图的单元格,并从核心数据实体中完美地填充。
我有+
和-
按钮绑定到NSArrayController
。当我按下加号按钮时,一个新的记录将被添加到核心数据中并显示在表上,当我选择一个条目并按减号时,该减号将从数据库中删除。因此,我已经为add/remove键重写了此代码。
@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)
}
我使表视图单元格可编辑。当按下加号按钮时,将创建一个新条目,并以文本"New“显示在表上。这个新条目创建了一个核心数据记录。我们叫它record 1
吧。
现在,我希望用户用他们想要的名称编辑条目。
所以我选择新的单元格,然后按enter键。该单元格现在处于编辑模式。我键入要传递给该单元格的新名称,该名称将传递给核心数据实体。
例如,我输入BONOBO并按ENTER键。
此表必须只包含唯一的名称。因此,一旦按下ENTER并且单元格结束编辑,我想检查核心数据,看看名称BONOBO是否已经被接受,如果是,拒绝名称并告诉用户提供一个新的名称。
这就是问题所在:一旦我按ENTER键,record 1
立即将其名称从New Entry
更改为BONOBO
,然后才能检查数据库中是否已经存在该条目,这意味着我所做的任何检查都会告诉我该记录是存在的。事实上,由于上下文尚未保存,因此记录存在于内存中。
我通过将所有单元格的委托设置为一个类并使用它的委托方法controlTextDidEndEditing(_ obj: Notification)
来拦截enter按下。
我也尝试为文本字段设置一个操作,但问题是相同的。
如何在核心数据更改发生之前拦截它?
发布于 2019-07-23 19:46:51
这里的诀窍是利用键值编码的内置验证方法。见对象验证。
我从未在托管对象中这样做过,但这个过程似乎与常规的KVC验证过程相同。您希望实现一个名称为:
validate<Key>:error:
..。其中'Key‘是您要验证的参数的名称。这将接受要验证的值的指针,以及NSError对象的指针。在该方法中,您将测试传入值是否可接受。您可以返回true以接受它,修改值并返回true以接受修改后的版本,或者返回false以直接拒绝它(修改error对象以使其返回给用户)。
https://stackoverflow.com/questions/57173725
复制相似问题