为什么NSViewController没有绑定表示对象?

时间:2014-03-22 03:44:27

标签: cocoa osx-mavericks cocoa-bindings nsviewcontroller

简而言之:我将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很简单:

enter image description here

这是第一个文本字段的绑定:

enter image description here

当我运行时,文本字段显示“Rob”,因此它在该方向上工作,但在编辑文本字段时,firstName的{​​{1}}属性不会更改。< / p>

我做错了什么?

修改:以下是上述代码的压缩项目文件的链接:https://drive.google.com/file/d/0B2NHW8y0ZrBwWjNzbGszaDQzQ1U/edit?usp=sharing

1 个答案:

答案 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];
}