我一直在努力探索OS X的StoryBoards - 特别是,我正在尝试使用Core Data编写基于文档的应用程序。
我无法弄清楚如何在StoryBoard中为各种视图控制器提供对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"]];
}
这是一个错误吗?显然,我有点不理解。
答案 0 :(得分:2)
我一直在调查同样的事情,到目前为止发现了一些事情。有些人建议让控制器在不执行基于文档的应用程序时通过层次结构查找备份以获取应用程序委托,但Apple建议将信息推送给控制器。使用NSPersistentDocument应用程序,我尝试使用文档类中makeWindowControllers()方法中的以下代码实现此目的。
(windowController.window?.contentViewController as! MyViewController).moc = managedObjectContext
这假定在视图控制器(类MyViewController)中称为moc的适当属性,它是层次结构中的第一个。您还可以使用表示的对象来存储此属性。如果愿意,可以为属性实现didSet方法,将其传递给其他控制器。
不幸的是我还在研究这种方法的细节,因为上面的方法是在控制器的viewDidLoad()调用之后调用的,并且moc不会被设置,这似乎也意味着阵列控制器的准备内容过早触发。
通常情况下,我不会对您的问题提交这样一个不完整的答案,但是由于没有权威的解决方案而这样做了。