Cocoa 无法在没有托管对象上下文的情况下执行操作

Posted

技术标签:

【中文标题】Cocoa 无法在没有托管对象上下文的情况下执行操作【英文标题】:Cocoa Cannot perform operation without a managed object context 【发布时间】:2011-08-09 14:10:49 【问题描述】:

我有一个基于 Mac 窗口的应用程序,它使用 CoreData 和 Cocoa 绑定将 CoreData 实体绑定到 NSArrayController 以在 NSCollectionView 中显示。

我的控制器(设置为视图文件所有者)上有一个名为 managedObjectConext 的属性。在 awakeFromNib 方法中,我尝试将 managedObjectContext (MOC) 属性设置为:

managedObjectContext = [(MyApplicationAppDelegate *)[[NSApplication sharedApplication] delegate] managedObjectContext];
managedObjectContext = [[NSApp delegate] managedObjectContext];

我还配置了 NSArrayControllers MOC 绑定到“文件所有者”MOC 属性和属性绑定到我的 CoreData 实体的属性。

但是,每次我在它即将进行绑定之前运行应用程序时,我都会收到以下错误消息:

我已经登录控制台检查 MOC 不是 nil,我认为它不是,因为这是来自 MOC 对象的 NSLog:myMoc = NSManagedObjectContext: 0x10052f9c0

我现在完全被难住了,很沮丧,本来应该如此简单的事情却占用了我这么多时间!任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

绑定是在 nib 中定义的,所以如果 nib 不知道控制器的 managedObjectContext 属性,那么绑定也不知道。

在界面编辑器中,您需要将数组控制器绑定面板中的 managedObjectContext 键绑定到特定的上下文。

对单上下文应用程序执行此操作的最简单方法是将应用程序委托中的 managedObjectContext 属性标记为 IBOutlet,以便它显示在界面编辑器中。然后直接从数组控制器的面板绑定它。

老实说,我不知道他们为什么不在 Xcode 模板本身中这样做。你最终会经常这样做。

【讨论】:

感谢您的回复,但我的 Nib 确实知道 managedObjectContext (所以我想!)。我已将数组控制器属性绑定到我的视图控制器(文件所有者) managedObjectContext 属性。我认为的问题是,当我将视图控制器 managedObjectContext 属性设置为 awakeFromNib 中的 [[NSApp delegate] managedObjectContext] 时,即使视图控制器 managedObjectContext 属性的 NSLog 与日志相同,它也不会执行绑定[[NSApp 委托] managedObjectContext]【参考方案2】:

我遇到了同样的问题。这修复了它:

移动线条:

managedObjectContext = [(MyApplicationAppDelegate *)[[NSApplication sharedApplication] delegate] managedObjectContext];
managedObjectContext = [[NSApp delegate] managedObjectContext];

awakeFromNib 方法到init 方法。

【讨论】:

【参考方案3】:

在 swift 中,将其添加到 ArrayController 附加到的任何视图控制器中:

    var managedObjectContext:NSManagedObjectContext? = 
            let delegater = NSApplication.sharedApplication().delegate as! AppDelegate
    return delegater.managedObjectContext
()

【讨论】:

【参考方案4】:

使用 Swift 4.x,您可以像这样在 ViewController 中创建一个 var:

   @objc dynamic var managedObjectContext:NSManagedObjectContext? = 
        let delegater = NSApplication.shared.delegate as! AppDelegate
        return delegater.persistentContainer.viewContext
()

然后将其绑定到您的 ArrayController :

【讨论】:

以上是关于Cocoa 无法在没有托管对象上下文的情况下执行操作的主要内容,如果未能解决你的问题,请参考以下文章

核心数据查询在托管对象上下文中插入新对象

在没有图像的情况下在 Cocoa 中保存 Webarchive

具有强制关系的 NSManagedObject

托管对象上下文是事务日志?

如何在没有额外自定义代码的情况下强制使正在运行的 Cocoa 程序失效?

父/子托管对象上下文究竟是如何工作的?