核心数据 – NSPersistentDocument StoryBoards:我没有正确混合

我一直在努力探索OS X的StoryBoards – 具体来说,我正在尝试使用Core Data编写基于文档的应用程序.

我无法弄清楚如何在StoryBoard中为各种View Controller提供对NSPersistentDocument的managedObjectController的访问权限.

在StoryBoards之前,如果您使用Core Data制作基于文档的应用程序,则会获得一个XIB文件,其中一个窗口的所有者是Document. Document有一组窗口控制器,但该XIB的所有者是Document.您可以添加NSArrayController,将其托管对象上下文绑定到所有者的托管对象上下文,一切都很好.

如果您使用StoryBoards创建项目,则顶级窗口由NSWindowController拥有. NSPersistentDocument在哪里?它被创建了,但我看不到在哪里或为什么.

此外,在您使用模板的初始故事板中,该窗口没有传入箭头,说它是入口点.如果删除窗口控制器并添加一个新窗口控制器,则它是一个箭头.现在,你将有两个两个窗口控制器 – 一个由故事板制作的控制器,一个由Document制作的控制器,它在makeWindowControllers方法中创建它

- (void)makeWindowControllers {
    // Override to return the Storyboard file name of the document.
    [self addWindowController:[[NSStoryboard storyboardWithName:@"Main" bundle:nil] instantiateControllerWithIdentifier:@"Document Window Controller"]];
}

这是一个错误吗?显然,有些东西我不理解.

最佳答案 我一直在调查同样的事情,到目前为止发现了一些事情.有些人建议让控制器在不执行基于文档的应用程序时通过层次结构查找备份以获取应用程序委托,但Apple建议将信息推送给控制器.使用NSPersistentDocument应用程序,我正在尝试使用文档类中的makeWindowControllers()方法中的以下代码实现此目的.

(windowController.window?.contentViewController as! MyViewController).moc = managedObjectContext

这假定在视图控制器(类MyViewController)中称为moc的适当属性,它是层次结构中的第一个.您还可以使用表示的对象来存储此属性.如果您愿意,可以为属性实现didSet方法以将其传递给其他控制器.

不幸的是,我仍在研究这种方法的细节,因为在控制器的viewDidLoad()之后调用上述方法并且moc将不会被设置,这似乎也意味着阵列控制器的Prepares Content过早触发.

通常情况下,我不会对你的问题提交这么完整的答案,但是由于没有权威的解决方案.

点赞