如何巧妙地将 Cocoa 输入绑定到 NSDocument 属性?

How do I neatly bind Cocoa inputs to NSDocument properties?

假设我有一个简单的 NSDocument 子类:

@interface Document : NSDocument
@property NSString *someText;
@end

我想将 someText 映射到我视图中的某个字段 - 所以我向我的视图控制器添加了一个新字段:

@interface ViewController : NSViewController
@property Document* document;
@end

...并确保存储我的文档:

- (void)setRepresentedObject:(id)representedObject {
    [super setRepresentedObject:representedObject];
    self.document = ((Document*)representedObject);    
}

哦,是的,我确保文档 属性 是动态的,通过一些谷歌搜索发现这对数据绑定很重要:

@implementation Document
@dynamic someText;
@end

然后转到我的 NSTextField 并尝试绑定值:

如您所见,它报告“Xcode 无法解析输入的键路径。”此外,“控制器密钥”字段(我认为我 应该 指定 document,键路径为 self.someText?)完全变灰出。

我做错了什么?

事实证明 @dynamic 不是必需的 - 必需的是视图控制器的 representedObject 设置得相当早。

我修改了文档 class 中默认生成的 makeWindowControllers 以便它在刚刚创建的 WindowController 的 contentViewController before 上设置 representedObject addWindowController 被调用:

- (void)makeWindowControllers {        
    NSWindowController *wc = [[NSStoryboard storyboardWithName:@"Main" bundle:nil] instantiateControllerWithIdentifier:@"Document Window Controller"];
    wc.contentViewController.representedObject = self;
    [self addWindowController:wc];    
}

然后,在我的情节提要中,我简单地使用 representedObject.someText 的模型关键路径绑定到 View Controller。 (如果事情似乎仍然没有改变,请务必勾选“持续更新值”——否则数据模型可能只会在某些事件(例如焦点更改)上更新。)