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 完全拒绝它(修改错误对象以返回一些东西给用户)。
我已关注 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 完全拒绝它(修改错误对象以返回一些东西给用户)。