使用NSDocument时如何将故事板视图绑定到Core Data实体?

Bob*_*man 5 core-data nsdocument cocoa-bindings xcode-storyboard

我正在构建一个使用核心数据,NSDocument,故事板和Cocoa绑定的OS X应用程序.

我的期望是发生以下情况:

  1. 创建MyDocument(NSDocument子类)的实例.

  2. MyDocument创建NSManagedObjectContext表示文档数据的核心数据.

  3. MyDocumentNSWindowController通过其标识符从故事板中实例化一个.

  4. 在故事板中,窗口控制器包含DocumentEditorViewController(NSViewController子类),用于显示和编辑文档.

  5. 在故事板中,DocumentEditorViewController有一个NSArrayController绑定到MyDocument托管对象上下文.

  6. 在故事板中,DocumentEditorViewController有一个绑定到的表视图NSArrayController.

这样,UI中的任何更改都可以使用它NSManagedObjectContext,而无需任何粘合代码.

我希望这是直截了当的,因为我相信我正按照预期的方式使用这些技术.但是我无法使绑定工作,特别是在第5步和第6步.我发现的所有项目模板和示例项目都不使用Core Data,不使用故事板,或者不使用NSDocuments.

应该绑定哪些对象?NSArrayController的类,键和密钥路径应该是什么?

回答这个问题的另一种方法是指出一个使用所有这些技术的工作示例项目.

Wil*_*eke 13

使用Core Data,Storyboard,NSArrayController,NSTableView和Bindings创建示例Xcode基于文档的应用程序项目的步骤.

步骤1创建Xcode项目.选择OS X Cocoa Application并选择"使用故事板","创建基于文档的应用程序"和"使用核心数据".

步骤2选择数据模型.添加实体'Person'和字符串属性'name'和'address'.

步骤3选择Main.storyboard.将NSArrayController添加到视图控制器场景中.将Mode设置为'Entity Name'并将Entity Name设置为'Person'.选中"准备内容".Managed Object Context将数组控制器绑定到View ControllerModel Key Path representedObject.managedObjectContext.

步骤4进入视图控制器场景视图.在此处删除"您的文档内容".添加NSTableView.绑定ContentArray Controller,控制器密钥arrangedObjects.绑定Selection IndexesArray Controller,控制器密钥selectionIndexes.绑定Sort DescriptorsArray Controller,控制器密钥sortDescriptors.

步骤5Value将表视图中的文本字段绑定到Table Cell ViewModel Key Path objectValue.nameobjectValue.address.选中'有条件设置可编辑'.

步骤6在视图控制器场景的视图中添加两个按钮"添加"和"删除".将操作连接到操作add:remove:阵列控制器.

步骤7(Objective-C)选择Document.h.在方法中makeWindowControllers,将语句替换[self addWindowController:…

NSWindowController *aWindowController = [[NSStoryboard storyboardWithName:@"Main" bundle:nil] instantiateControllerWithIdentifier:@"Document Window Controller"];
[self addWindowController:aWindowController];
aWindowController.contentViewController.representedObject = aWindowController.document;
Run Code Online (Sandbox Code Playgroud)

第7步(Swift)选择Document.swift.在方法中makeWindowControllers,在self.addWindowController(windowController)添加后结束

 windowController.contentViewController!.representedObject = windowController.document
Run Code Online (Sandbox Code Playgroud)

步骤8构建,运行,测试.