2

这是我想与您分享的 2 个绑定问题,与在IB中配置时的选择器名称和参数有关。

CoreData通过 an 检索对象ArrayController并填充在NSTableView. 所有的绑定都是通过Interface Builder完成的。每行包含一个按钮,该按钮应检查 url(实体的属性之一)。

1.为了使按钮触发,我首先尝试以这种方式绑定它:

对于目标:

  • 绑定到:文件的所有者(在本例中为 a ViewController
  • 模型密钥路径:self
  • 选择器名称:revealInFinder:

对于论点:

  • 绑定到:Table Cell View
  • 模型键路径:ObjectValue
  • 选择器名称:revealInFinder: (<automatically set>)

当我单击按钮时,revealInFinder(object: NSManagedObject)我在 中编写的函数ViewController根本不会被调用:我尝试了带或不带参数,带或不带冒号,没有任何反应:没有触发断点,控制台中没有消息。我可以在选择器名称中放入随机字符,我什至没有得到

“无法识别的选择器名称”!

...如果我在 中更改函数的名称ViewController,或者只是将其删除,同样的事情:没有任何反应,控制台中也没有错误(当然,我已经检查过:文件的所有者设置为ViewController,但是无论如何都不会显示视图)。

由于绑定是在 IB 中而不是在代码中进行的,因此很难跟踪和调试我的错误(我还将 -NSBindingDebugLogLevel 1 放在“启动时要传递的参数”中,如此处推荐:https://developer.apple。 com/library/mac/documentation/Cocoa/Conceptual/CocoaBindings/Concepts/Troubleshooting.html)。但是我应该如何处理显然是“非事件”的事情?当然我在这里遗漏了一些东西,但是什么?

2-我决定以不同的方式绑定按钮:

对于目标:(起初没有参数)

  • 绑定到:表格单元格视图
  • 模型键路径:ObjectValue(所以是 Core Data 的实体,对吗?)
  • 选择器名称:revealInFinder:

这很有效,因为我NSManagedbject为我的实体创建了子类,并为它们编写了扩展。当我添加一个参数时会出现问题,因为我需要让 managedObjectContext 在函数内部进行一些获取:

对于论点:

  • 绑定到:文件的所有者
  • Model Key Path:self.managedContext(moc在viewController中设置)

在一堆“发送了无法识别的选择器”消息之后,我设法编写了这个函数(不太清楚为什么它只用“_”调用):

func revealInFinder(_ managedContext: NSManagedObjectContext)

但传递的参数仍然存在0x00000000... (<uninitialized> in the console)我通过删除自我更改了模型密钥路径。,然后将其绑定到managedObjectContextArrayController代替):

  • 绑定到:阵列控制器
  • 控制器键:ArrangedObjects
  • 模型键路径:managedObjectContext

moc 仍然未初始化。

  • 为什么我的第一次尝试没有触发任何动作?

  • 为什么该参数在第二次尝试中未初始化(甚至不是"nil")?

4

0 回答 0