这是我想与您分享的 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)
。我通过删除自我更改了模型密钥路径。,然后将其绑定到managedObjectContext
的ArrayController
代替):
- 绑定到:阵列控制器
- 控制器键:ArrangedObjects
- 模型键路径:managedObjectContext
moc 仍然未初始化。
为什么我的第一次尝试没有触发任何动作?
为什么该参数在第二次尝试中未初始化(甚至不是"nil")?