Tableview 更新模糊区域中的值

Tableview updates values in the twilight zone

我已关注 this tutorial 并成功将我的 NSTableView 绑定到核心数据实体。

table 是一个基于视图的单元格,完全由核心数据实体填充。

我有 +- 按钮绑定到 NSArrayController。当我按下加号按钮时,一条新记录被添加到核心数据并出现在 table 上,当我 select 一个条目并按下减号时,即从数据库中删除。就此而言,我已经为 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)
  }

我制作了 table 视图单元格 editable。当按下加号按钮时,将创建一个新条目并显示在 table 上,文本为 "New Entry"。这个新条目创建了一个核心数据记录。我们称它为 record 1.

现在我希望用户使用他们想要的名称编辑条目。

所以我 select 新单元格并按回车键。该单元格现在处于编辑模式。 我为该单元格键入我想要的新名称,该名称将传递给核心数据实体。

例如,我输入 BONOBO,然后按 ENTER。

此 table 必须仅包含唯一名称。因此,一旦按下 ENTER 并且单元格结束编辑,我想检查核心数据以查看名称 BONOBO 是否已被占用,如果是,则拒绝该名称并告诉用户提供一个新名称。

这就是问题所在:我一按 ENTER,record 1 立即将其名称从 New Entry 更改为 BONOBO,然后我才能检查该条目是否已存在于数据库,这意味着我所做的任何检查都会告诉我该记录存在。实际上记录存在于内存中,因为上下文尚未保存。

我通过将所有单元格的委托设置为 class 并使用其委托方法 controlTextDidEndEditing(_ obj: Notification).

来拦截回车键

我也尝试过为文本字段设置一个动作,但问题是一样的。

如何在核心数据发生变化之前拦截它?

这里的技巧是利用 Key-Value Coding 的 built-in 验证方法。参见 Object Validation

我从未对托管对象执行过此操作,但该过程似乎与常规 KVC 验证相同。您想要实现一个名为:

的方法
validate<Key>:error:

... 其中 'Key' 是您要验证的参数的名称。这需要一个指向您要验证的值的指针,另一个指向 NSError 对象。在方法内部测试 passed-in 值是否可接受。您可以 return true 接受它,修改值和 return true 接受修改后的版本,或者 return false 完全拒绝它(修改错误对象以返回一些东西给用户)。