NSPersistentDocument,Swift,macOS和storyboards - 如何获取managedObjectContext?

时间:2016-07-16 03:36:39

标签: swift macos core-data xcode-storyboard nspersistentdocument

自从我解决了CoreData和macOS以来,已经有一段时间了,早在xib和nibs时代。使用xib,可以使用“文件所有者”来访问您的文档和managedObjectContext。容易。

使用NSPersistentDocument和我的故事板,我有点鸡和蛋的问题。在我的Document类中,从NSPersistentDocument子类化,我有以下内容:

override func makeWindowControllers() {
    // Returns the Storyboard that contains your Document window.
    let storyboard = NSStoryboard(name: "Main", bundle: nil)
    let windowController = storyboard.instantiateControllerWithIdentifier("Document Window Controller") as! NSWindowController // <- when I need the moc
    self.addWindowController(windowController)
    windowController.contentViewController!.representedObject = self // <- when I set the representedObject
}

这似乎是包括苹果在内的许多人所暗示的。

我的问题是:在MainViewController中,我想要一个对象控制器,它需要绑定到managedObjectContext,但是当它需要有managedObjectContext时,我还没有将representObject设置为self。因此抛出异常。在makeWindowControllers方法的末尾设置representObject为时已晚,但我还是没有看到它在之前得到它。

1 个答案:

答案 0 :(得分:1)

好。所以。我不知道昨晚发生了什么,但我无法让这个工作。

今天早上,我重新阅读了有关representObject的文档:

  

representObject属性是键值编码和键值观察兼容。当您将表示的对象用作文件的nib文件的所有者时,您可以使用以字符串表示的对象开头的键路径将控件绑定到文件的所有者。

文档清楚地告诉我魔术在代表对象中。所以我确保我的makeWindowControllers方法如上所述,我确保我的故事板中的对象控制器就像文档所说的那样。

Don’t mind the (!)

我对路径有一点(!)并不感到惊讶,因为代表对象只是一个AnyObject。

然后我尽职尽责地启动了应用程序,完全期望它不起作用。

但它奏效了。不知道为什么昨天它没有,但我不能做很多关于已经失去的时间。

跟进:作为一项实验,我尝试了昨天的一个曲折。为了摆脱(!)并为moc提供一个参考,我将这个方法添加到MainViewController:

var moc:NSManagedObjectContext? {
    if let doc = self.representedObject as? Document {
        return doc.managedObjectContext
    }
    return nil
}

然后我使用“self.moc”作为我的对象控制器的模型关键路径。这不起作用,抛出了熟悉的异常。将模型密钥路径恢复为“self.representedObject.managedObjectContext”,并且一切正常。 ......就像魔术一样。