【问题标题】:this class is not key value coding-compliant for the key managedObjectContext此类与键 managedObjectContext 的键值编码不兼容
【发布时间】:2011-03-17 18:19:52
【问题描述】:

更新!我创建了一个说明问题的净化测试程序。
Here you can view a PDF of exactly what I've done, and download a .zip of the project

更新2!请参阅下面的 Conceited Code 的评论线程以了解有关此问题的更多信息。

更新:增加了赏金,我正在寻找对我的示例实际错误的解释,修复它的方法,以及比当前的“LoadNib_Controller”更适合我的目的的设计(请参阅自负代码评论讨论)

我收到运行时错误消息 " [<My_WindowLoader 0x100228ba0>valueForUndefinedKey:]: 这个类与键 managedObjectContext 的键值编码不兼容。"

My_WindowLoader 有一个对 My_AppDelegate 的引用(我已经调试过并且肯定设置正确)。它还有一些 My_WindowController *'s .. 它们是 My_WindowController : NSWindowController。使用它们是为了向 Windows 提供一个属性(managedObjectContext),当我加载 nib 时加载它,这样我就可以设置我的核心数据绑定。他们看起来像..

.h:
@interface My_WindowController : NSWindowController {

NSManagedObjectContext *managedObjectContext;

}

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

.m
@synthesize managedObjectContext;

My_WindowLoader 以下列方式加载 nib:

Window1_WindowController = [[My_ WindowController alloc] initWithWindowNibName:@"Window1" owner:self];
// The following line I have debugged and it does in fact go to my app delegate, wherein it instantiates a MOC (since this is the first place in the code that it's used..), and returns it, and it appears to also be setting it via the property in My_WindowController
[Window1_WindowController setManagedObjectContext:[AppDelegate managedObjectContext]];

// The following is where I get my problem, this does load my window but in my gdb window I see the runtime error message that I list at the top of this post 
NSWindow *window1Pointer = [Window1_WindowController window];

为了得到上述运行时错误,在我的 Window1.nib 中,我有数组控制器,它们使用模型键路径“managedObjectContext”将它们的托管对象上下文绑定到“文件所有者”。文件的所有者是类型 My_WindowController

显然出了点问题,但我已经使用调试器以及使用常识逐步完成了它,这一切似乎都应该起作用。我看到大多数“这个类不是 kvc ..”错误源于 IBOutlet/IB 等中的错误命名,但我在这里对所有这些进行了三次检查,并确保我完全退出并重新启动了 Xcode/IB 并加载了最新的。

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    感谢freenode上的#cocoa,我的问题是我正在做:

    Window1_WindowController = [[My_ WindowController alloc] initWithWindowNibName:@"Window1" owner:self];
    

    我应该这样做

    Window1_WindowController = [[My_ WindowController alloc] initWithWindowNibName:@"Window1"];
    

    注意 initWithWindowNibName: 与 initWithWindowNibName:owner: 的区别

    此外,放置此代码的正确位置是在 AppDelegate 中,它是 App 控制器,这种类型的逻辑就在那里。

    【讨论】:

      【解决方案2】:

      问题是由您绑定到 managedObjectContext 的新窗口中的 NSArrayController 引起的。如果取消选中“引发不适用的键”,则错误变为“没有托管对象上下文无法执行操作”。我认为您的班级中的托管对象上下文有问题。

      编辑: 见 cmets

      【讨论】:

      • 是的,我理解那部分,但为什么呢?我需要 MOC 可用于除 MainMenu.nib 之外的笔尖中的 NSArrayControllers
      • 更新了我的答案。还不太清楚问题出在哪里。 managedObjectContext 可能由于某种原因无效。
      • 听起来你可能正在做某事,有趣的是在这种情况下错误会发生变化
      • 下次执行此操作时,请记住,如果您使用更多代码而不是界面构建器并将尽可能多的窗口分隔到更多 nib 中,则调试此类问题会容易得多。我会在它自己的 NIB 中创建第一个窗口,并让委托打开它并在其中设置一个 managedObjectContext。这样,当打开下一个窗口时,您只需传递 managedObjectContext 而不是引用委托。
      • 终于让它工作了!将代理连接到 LoadNib_Controller 的方式肯定有问题。如果我采用完全相同的代码并将其添加到委托并将按钮连接到委托中的方法并完全删除 LoadNib_Controller ,那么它可以完美运行。您设置它的方式确实令人困惑,我不确定问题出在哪里,但是如果您按照我上面的评论进行操作,那么我们可能会发现问题(将窗口与菜单分开并且不要访问应用程序的直接代表)。
      【解决方案3】:

      您的 NIB 是否有一个正确连接到 File's Owner (Window1_WindowController) 的 NSWindow?

      【讨论】:

      • 我已将文件的所有者“窗口”链接到 Window1 的 NSWindow。这就是我设置的所有内容。如果我进入 Window1 笔尖并取消绑定我的 NSArrayController 的 managedObjectContext 然后我的代码(My_WindowLoader 调用 [Window1_WindowController window]; 实际上加载并显示 window1
      【解决方案4】:

      您文件的所有者是错误的对象。它应该是具有 managedObjectContext 属性的窗口控制器。你为什么要制作一个单独的控制器来加载笔尖?这不是标准做法。 NSWindowController 旨在加载自己的 nib。它应该是文件的所有者。它应该用 [[MyWindowController alloc] initWithNibName:@"MyWindow"] 实例化。

      【讨论】:

      • 我继承了 NSWindowController 并简单地添加了一个属性,以便可以将其传递给 MOC 的引用。如何在不继承 NSWindowController 的情况下传递 moc 来支持它?
      猜你喜欢
      • 2017-09-27
      • 2015-08-27
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      相关资源
      最近更新 更多