早在xib和nibs时代,我就已经有一段时间没有处理CoreData和macOS了。有了xib,就有了“文件的所有者”,可以让您访问文档和managedObjectContext。很简单。
与NSPersistentDocument和我的故事板,我有点鸡和鸡蛋的问题。在我的文档类(来自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时,我还没有将representedObject设置为self。所以会抛出一个异常。将representedObject设置在makeWindowControllers方法的末尾已经太晚了,但我不认为可以更早地获得它。
发布于 2016-07-16 16:06:04
好吧。所以。我不知道昨晚发生了什么,但我不可能做到这一点。
今天早上,我重读了有关representedObject的文档:
representedObject属性是键值编码和键值观察兼容的.当使用表示对象作为nib文件的所有者时,可以使用以字符串representedObject开头的键路径将控件绑定到文件所有者。
文档清楚地告诉我,魔法在representedObject中。因此,我确保我的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”,所有这些都能很好地工作。…像魔法一样。
https://stackoverflow.com/questions/38407459
复制相似问题