简而言之:我将NSTextField
绑定到文件所有者(视图控制器)和representedObject.firstName
的模型关键路径,但编辑文本字段不会更改firstName
。
以下是更多详情。我有一个简单的程序,除了创建Thing
(一个带有一些属性的简单类)和ThingViewController
的实例之外什么都不做。控制器具有关联的.xib
,其中包含一个简单的用户界面 - 几个文本字段可绑定到Thing
的属性。
@interface Thing : NSObject
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;
@property (nonatomic) BOOL someBool;
@end
在app delegate中......
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSView *cv = self.window.contentView;
ThingViewController *vc = [[ThingViewController alloc]
initWithNibName:@"ThingViewController" bundle:nil];
theThing = [Thing new];
theThing.firstName = @"Rob";
vc.representedObject = theThing;
[cv addSubview:vc.view];
}
ThingViewController.xib
很简单:
这是第一个文本字段的绑定:
当我运行时,文本字段显示“Rob”,因此它在该方向上工作,但在编辑文本字段时,firstName
的{{1}}属性不会更改。< / p>
我做错了什么?
修改:以下是上述代码的压缩项目文件的链接:https://drive.google.com/file/d/0B2NHW8y0ZrBwWjNzbGszaDQzQ1U/edit?usp=sharing
答案 0 :(得分:2)
除了-applicationDidFinishLaunching中的局部变量之外,没有什么能强烈引用你的视图控制器(ThingViewController)。一旦超出范围,视图控制器就会被释放并解除分配。视图本身仍然存在,因为它是窗口contentView的子视图。
一旦你的视图控制器被释放/消失,文本字段就没有连接回Thing对象,因此它实际上调用了[nil setValue:@“New first name”forKeyPath:@“representObject.firstName”]。 / p>
为视图控制器添加强引用(例如,应用代理的实例变量)并再次尝试。
@implementation AppDelegate {
Thing *theThing;
ThingViewController *vc;
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSView *cv = self.window.contentView;
vc = [[ThingViewController alloc] initWithNibName:@"ThingViewController" bundle:nil];
theThing = [Thing new];
theThing.firstName = @"Rob";
vc.representedObject = theThing;
[cv addSubview:vc.view];
}