如何巧妙地将 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
。 (如果事情似乎仍然没有改变,请务必勾选“持续更新值”——否则数据模型可能只会在某些事件(例如焦点更改)上更新。)
假设我有一个简单的 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
。 (如果事情似乎仍然没有改变,请务必勾选“持续更新值”——否则数据模型可能只会在某些事件(例如焦点更改)上更新。)