子类 NSWindowController 核心数据

Posted

技术标签:

【中文标题】子类 NSWindowController 核心数据【英文标题】:subclass NSWindowController Core Data 【发布时间】:2013-08-09 18:09:37 【问题描述】:

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

所以在浏览完之后,我决定我需要创建一个 NSWindowController 子类,并在选择表中的框时使用它来更新标签。曾经尝试过,但失败了。在我将标签连接到窗口控制器之前,我遇到了一个问题。在模板 cmets 之后,我将其添加到 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;

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

日志消息在启动时出现,但是在窗口出现之前我得到一个异常“这个类不符合键 managedObjectContext 的键值编码”。我猜我没有正确连接到文档类的窗口控制器?我的另一个想法是数组控制器位于窗口控制器 nib 中,而不是文档 nib 中,所以它可能在错误的位置寻找 managedObjectContext?

【问题讨论】:

【参考方案1】:

我会尝试不同的方法:将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 或观察变化。

【讨论】:

以上是关于子类 NSWindowController 核心数据的主要内容,如果未能解决你的问题,请参考以下文章

来自笔尖的 NSWindowController 子类初始化不使用 -initWithCoder:?

Swift 中的 NSWindowController。使用 Nib 进行子类化和初始化

如何通过按 ESC 键关闭窗口(NSWindowController)?

NSWindowController showWindow 只工作一次

self window 为空,但 Window 插座已正确链接

通过 NSWindowController 从窗口中删除 RepresentedFilename