0

回到 xib 和 nib 时代,我已经有一段时间没有处理 CoreData 和 macOS 了。使用 xib,有“文件所有者”可以让您访问您的文档和 managedObjectContext。简单的。

使用 NSPersistentDocument 和我的故事板,我遇到了一些先有鸡还是先有蛋的问题。在从 NSPersistentDocument 子类化的 Document 类中,我有以下内容:

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 时,我还没有将代表对象设置为 self。所以抛出异常。在 makeWindowControllers 方法的末尾设置代表对象为时已晚,但我看不到更早的时间。

4

1 回答 1

1

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

今天早上,我重新阅读了有关代表对象的文档:

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

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

不要介意(!)

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

然后,我尽职尽责地启动了该应用程序,完全期望它无法正常工作。

但它奏效了。不知道为什么昨天没有,但我对已经失去的时间无能为力。

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

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

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

于 2016-07-16T16:06:04.677 回答