基于文档的Swift应用程序中看似黑暗的Cocoa绑定艺术



我一直在阅读在线教程和苹果文档,但作为一个刚开始编写Cocoa应用程序(25年嵌入式C/C++固件和网络代码)的人,这种Cocoa绑定的黑暗艺术对我来说毫无意义。

1) 我在XCode中创建了一个基于文档的MacOSCocoa应用程序。

2) 在其中,我创建了一个名为DocumentData的类,它是NSObject的子类。

3) 在DocumentData中是"foo"one_answers"bar",这两个"动态"属性都是Strings

4) 我的NSDocumentDocument子类包含一个名为docDataDocumentData属性。

5) 在我的Document类的makeWindowControllers()方法中,我通过在self.addWindowController(windowController)之后添加以下内容,将viewController的表示对象设置为其docData属性:

if let viewController = windowController.contentViewController as! ViewController? { viewController.representedObject = self.docData }

6) 在视图控制器场景中,我向视图控制器视图添加了两个NSTextFields,并分别称它们为"Foo"one_answers"Bar"。

7) 我使用Assistant将它们ctrl拖动到View Controller swift代码窗口,在View Controller中创建两个IBOutlets,分别称为"foo"one_answers"bar"。

8) 在我的Document类的read()方法中,我添加了两行代码来设置docData对象的两个属性:

docData.foo = "foo"
docData.bar = "bar"

在这一点上,我认为如果我能正确设置Cocoa绑定,当我从应用程序的"文件"菜单中使用"打开"打开一个具有应用程序文件扩展名的文档时,我认为应该出现一个窗口,其标题设置为我所选文件的名称,并且窗口中的两个NSTextField对象分别表示"foo"one_answers"bar"。

问题是,我对如何进行这些绑定完全感到困惑。我已经看到了十个不同的例子,它们有不同的绑定方式,但似乎对我来说什么都不起作用

我应该向视图控制器添加NSArrayController吗?

我应该向视图控制器添加NSObjectController吗?

在XCode令人困惑的用户界面中,我应该如何设置确切的绑定?

我相信这可能很简单,但我不明白。任何帮助或在线教程的指针,如果不认为XCode IDE的经验比我迄今为止在网上找到的要丰富得多,我将不胜感激。

当这对我有用时,我很高兴把代码放在github的某个地方,并对其进行评论,以帮助其他人与XCode的邪恶IDE作斗争,因为它与这些绑定有关。

步骤1-6都很好。步骤7不是绑定所必需的,但您的应用程序可能仍然需要它。第8步很好。

我认为您所缺少的只是将NSTextFields绑定到您的视图控制器。

您可以直接将它们绑定到视图控制器,而无需使用NSObjectControllerNSArrayController

在Interface Builder中,在右侧的绑定检查器选项卡中,您将把value属性绑定到foobar

将选中Bind to并选择您的视图控制器。

Controller Key将为空,Model Key Path将为self.representedObject.fooself.representedObject.bar,具体取决于您正在绑定的文本字段。

有关可用绑定的更多信息,请参阅此处的NSTextField绑定文档。

有关正确绑定的"黑暗艺术"的更多信息,请查看我在这里的答案中链接的示例项目。

最新更新