我刚开始使用Cocoa Bindings,我正在开发第一个应用程序。
许多样本和书籍使用NSArrayController
,但由于我只想将单个对象及其属性绑定到某些Textfields,因此我使用了NSObjectController
。我也没有基于文档的应用程序。我的应用程序是一个简单的单窗口应用程序。
当我尝试将NSObjectController
绑定到文件所有者时,就像所有示例一样,我开始遇到问题。如果我这样做,我无法编译应用程序。我总是得到“此类不符合键值”错误
但是,如果我将NSObjectController
绑定到我的应用程序的AppController实例,它就可以正常工作。我还设法将Textfield绑定到NSObjectController
的字段。这也可行。
但我不知道我做的是否正确。我找到的所有样本都绑定到文件所有者 - 这对我的应用程序不起作用。绑定到应用程序控制器似乎是非基于文档的应用程序的完美方式。
答案 0 :(得分:3)
绑定NSObjectController
的{{1}}绑定时,您正在做的是告诉控制器如何找到您想要编辑的对象。这是使用键值编码完成的,其中字符串用于导航可能的许多对象关系以定位值。在运行时,对象控制器将使用您绑定控制器的对象和您在Interface Builder中指定的密钥路径来调用contentObject
。
Interface Builder中的文件所有者出口是指加载NIB时指定为[object valueForKeyPath:keyPath]
的对象。在基于文档的应用程序中,这通常是owner
。在非文档应用程序中,文件所有者通常是NSWindowController
实例。但是你没有(也不应该)继承NSApplication
,所以在你的appilcation中,File的所有者不是寻找对象的正确位置。
相反,您很可能将对象添加到Application Delegate中,因此将对象控制器绑定到非基于文档的应用程序中的Application委托是有意义的。作为一个建议,我将回到你已经完成的前面的例子,看看你是否可以弄清楚这些对象控制器如何找到它们的内容对象。一旦你看到对象控制器和它控制的对象之间的连接,绑定应该对你更有意义。
答案 1 :(得分:0)
您希望将ObjectController绑定到对象。如果您正在处理具有单个nib的非文档应用程序,则该文件的所有者将是NSApplication的实例。
不要认为绑定到File的所有者是特殊的,它只是nib对象所有者的占位符 - 您可以在nib文件的检查器中看到这一点。绑定任何适当的对象。