子类 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 只工作一次