子类NSWindowController核心数据

时间:2013-08-09 18:09:38

标签: core-data subclass nswindowcontroller

我有一个新问题,我试图在网上找到答案但未成功。任务很简单:我想创建一个基于核心数据文档的应用程序,但改变一些标签对象中的值。使用接口构建器,我可以使用数组控制器,表等构建核心数据模型并填充它,而无需编写任何代码。到现在为止还挺好。我的测试示例是使用具有长度和宽度属性的Box实体构建核心数据模型。我想要一个标签来显示区域,即任何几何挑战的长度*宽度:)。

因此浏览后,我决定创建一个NSWindowController子类,并在选择表格中的框时使用它来更新标签。试过这个,但都失败了。在我将标签连接到窗口控制器之前,我遇到了问题。在模板评论之后,我将其添加到Document.m:

- (void)makeWindowControllers
{
    NSLog(@"Adding custom Window Controller");
    MyWindowController* myWindowController = [[MyWindowController alloc] init];
    [self addWindowController:myWindowController];
}

还将此添加到模板MyWindowController.m:

- (id)init
{
    self = [super initWithWindowNibName:@"MyWindowController"];
    return self;
}

窗口控制器在Interface builder中有自己的NIB文件,我在其中放置表和标签等。文件所有者设置为MyWindowController。可能会忘记其他事情,但这就是我现在所记得的。

启动时会显示日志消息,但在窗口出现之前,我会收到一个异常“此类与密钥managedObjectContext不符合密钥值编码”。我猜我没有正确连接到文档类的窗口控制器?我的另一个想法是数组控制器在窗口控制器nib中,而不是文档nib,所以也许它在forObjectObject文件的错误位置?

1 个答案:

答案 0 :(得分:0)

我会尝试不同的方法:将area添加到Box实体作为只读属性。使用Xcode自动创建Box类(查看数据模型时,在“编辑器”菜单中创建“创建NSManagedObject子类”菜单项),然后将其添加到Box.h

@property (weak, readonly) NSString * area;

这是Box.m

- (NSNumber *)area
{
    return [NSNumber numberWithDouble:([[self length] doubleValue] - [[self width] doubleValue])];
}

+ (NSSet *)keyPathsForValuesAffectingArea
{
    return [NSSet setWithObjects:@"length", @"width", nil];
}

如果这样做,您可以将area绑定到标签值,就像对其他Box属性一样。无需子类NSWindowController或注意更改。