我有一个新问题,我试图在网上找到答案但未成功。任务很简单:我想创建一个基于核心数据文档的应用程序,但改变一些标签对象中的值。使用接口构建器,我可以使用数组控制器,表等构建核心数据模型并填充它,而无需编写任何代码。到现在为止还挺好。我的测试示例是使用具有长度和宽度属性的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文件的错误位置?
答案 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
或注意更改。