这个类不符合键值编码的要求,针对managedObjectContext这个键。

3

更新!我创建了一个经过消毒处理的测试程序,说明了问题。
您可以在这里查看我所做的事情的PDF,并下载项目的.zip文件

更新2!请查看下面Conceited Code的评论线程,以了解更多关于此问题的信息。

更新:添加赏金,我正在寻找对我的示例实际存在的问题进行解释、修复和比当前“LoadNib_Controller”更适合我的目的的设计的说明(请参见Conceited Code的评论讨论)

我收到一个运行时错误消息:" [<My_WindowLoader 0x100228ba0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key managedObjectContext."

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

.h:
@interface My_WindowController : NSWindowController {

NSManagedObjectContext *managedObjectContext;

}

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

.m
@synthesize managedObjectContext;

我的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,并且已经有了最新的加载。
4个回答

3
感谢freenode上的#cocoa,我的问题是我正在执行以下操作:
Window1_WindowController = [[My_ WindowController alloc] initWithWindowNibName:@"Window1" owner:self];

我应该做什么

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

注意initWithWindowNibName:和initWithWindowNibName:owner:之间的区别。
此外,将此代码放置在AppDelegate中是正确的位置,因为它是应用程序控制器,在那里处理这种逻辑很合适。

1
问题是由于您已将NSArrayController绑定到您的managedObjectContext的新窗口所造成的。如果取消选中“对不适用键引发异常”,则错误变为“无法执行操作,因为没有托管对象上下文”。我认为您的类中的托管对象上下文存在问题。
编辑: 请查看评论。

是的,我理解那部分,但为什么呢?我需要MOC在除MainMenu.nib之外的nib中对NSArrayControllers可用。 - Nektarios
听起来你可能有所发现,有趣的是在那种情况下错误会改变。 - Nektarios
下次做这个的时候,请记住,如果您使用更多的代码而不是界面构建器,并将尽可能多的窗口分离到更多的nib中,则调试此类问题会容易得多。我会在自己的NIB中创建第一个窗口,并让委托打开它并在其中设置managedObjectContext。这样,当打开下一个窗口时,您只需传递managedObjectContext即可,而无需引用委托。 - Conceited Code
终于搞定了!连接委托到LoadNib_Controller的方式肯定有问题。如果我将完全相同的代码添加到委托中,并将按钮连接到委托中的方法,然后完全删除LoadNib_Controller,那么它就可以完美地工作了。你设置的方式真的很令人困惑,我不确定问题出在哪里,但是如果你按照我上面的注释进行操作,我们可能可以找到问题(将窗口与菜单分开,并且不要直接访问应用程序的委托)。 - Conceited Code
不。请委托打开第一个窗口(它在另一个 Nib 文件中,其文件所有者是控制器)。然后让窗口控制打开更多的窗口。当加载和保存核心数据时,应该只使用委托。 - Conceited Code
显示剩余3条评论

0

你的 NIB 文件是否正确连接到 File's Owner (Window1_WindowController) 中的 NSWindow?


我已将文件所有者“window”链接到Window1的NSWindow。这就是我所设置的全部内容。如果我进入Window1 nib并取消绑定我的NSArrayController的managedObjectContext,那么我的代码(My_WindowLoader调用[Window1_WindowController window];实际上会加载和显示window1。 - Nektarios

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

我对NSWindowController进行了子类化,并添加了一个属性,以便可以将MOC的引用传递给它。如何在不对NSWindowController进行子类化的情况下传递MOC? - Nektarios

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接