macos - Tableview 更新暮色区域中的值

标签 macos cocoa core-data nstableview nstablecellview

我已关注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/

相关文章:

xcode - Mac OSX 10.8.4 上带有 GLFW3 的现代 OpenGL - 缺少 glGenVertexArrays() 和 glBindVertexArray()?

objective-c - 我可以阻止 Spotlight NSMetadataQuery 吗?

objective-c - Obj-C 类接口(interface)中的尖括号 "<…>"是做什么用的?

ios - CoreData 排序实体 - 性能

iphone - 对具有许多对象的核心数据进行单元测试

C HelloWorld exec 格式错误

ruby - gem install pg error : couldn't understand kern. osversion `14.0.0' on Yosemite w/Ruby 2.1.5

ios - OS X/iOS 崩溃报告中的不同异常代码是什么意思?

objective-c - WebView:启用 ARC 的应用程序中的 libdispatch 泄漏

objective-c - 无法将属性设置为 NSManagedObject