对于密钥managedObjectContext,此类不符合密码值编码

时间:2010-07-19 05:54:32

标签: objective-c cocoa

  

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

     

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

     

更新:添加赏金,我正在寻找一个解释我的示例实际上有什么问题,修复了什么,以及什么设计比当前的“LoadNib_Controller”更适合我的目的(参见自负的代码评论讨论)

我收到运行时错误消息 “[< My_WindowLoader 0x100228ba0 > valueForUndefinedKey:]:此类与密钥managedObjectContext不符合密钥值编码。”

My_WindowLoader有一个对My_AppDelegate的引用(我已经调试过并且确实设置正确)。它还有一些My_WindowController *的..它们是My_WindowController:NSWindowController。它们被使用,以便我可以向Windows提供一个属性(managedObjectContext),当我加载nib时,它会加载,以便我可以设置我的Core Data绑定。他们看起来像..

.h:
@interface My_WindowController : NSWindowController {

NSManagedObjectContext *managedObjectContext;

}

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

.m
@synthesize managedObjectContext;

My_WindowLoader以下列方式加载一个笔尖:

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并且最新加载。

4 个答案:

答案 0 :(得分:3)

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

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

我应该做

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

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

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

答案 1 :(得分:1)

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

编辑: 见评论

答案 2 :(得分:0)

您的NIB是否已将NSWindow正确连接到File's Owner (Window1_WindowController)

答案 3 :(得分:0)

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