【问题标题】:NSPersistentDocument + StoryBoards: not mixed properly for meNSPersistentDocument + StoryBoards:对我来说没有正确混合
【发布时间】:2015-01-28 11:13:29
【问题描述】:

我一直在尝试了解 OS X 的 StoryBoards —— 具体来说,我正在尝试使用 Core Data 编写基于文档的应用程序。

我不知道如何让 StoryBoard 中的各种视图控制器访问 NSPersistentDocument 的 managedObjectController。

在 StoryBoards 之前,如果您使用 Core Data 制作基于文档的应用程序,您会得到一个 XIB 文件,其中包含一个窗口,其所有者是文档。 Document 有一个窗口控制器数组,但该 XIB 的所有者是 Document。你可以添加一个NSArrayController,将它的Managed Object Context绑定到所有者的Managed Object Context,一切都很好。

如果您使用 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"]];
}

这是一个错误吗?显然有些东西我不明白。

【问题讨论】:

  • 我也有同样的问题。你知道怎么做吗?

标签: core-data storyboard xcode6


【解决方案1】:

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

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

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

不幸的是,我仍在研究这种方法的细节,因为上面的方法是在控制器的 viewDidLoad() 之后调用的,并且 moc 不会被设置,这似乎也意味着数组控制器的 Prepares内容 过早触发。

通常我不会对您的问题提交如此不完整的答案,但由于缺乏权威的解决方案而这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多