objective-c – 在基于文档的OS X应用程序中的NSViewController上设置representObject

我正在开发一个简单的OS X
Cocoa应用程序,其中用户填写表单,应用程序执行一些在其他字段中弹出的计算.

我从Xcode 6.3.2(Yosemite)上的默认基于文档的应用程序模板开始.该模板包含NSDocument的子类和NSViewController的子类.界面在Storyboard中定义. NSDocument从makeWindowControllers中的Storyboard初始化接口.

我遇到了将接口的各个部分绑定到ViewController的representObject的问题 – 事实证明我绑定到了nil.从不调用ViewController的setRepresentedObject方法.

我尝试在viewDidLoad中使用ViewController调用setRepresentedObject,但是WindowController的文档属性在那时没有设置(它返回了nil).

并且我不清楚是否可以从NSDocument获取ViewController的实例 – NSDocument知道它的窗口/ WindowController,但我不确定如何从这些类中找到ViewController.

我想知道习惯性的Xcode / Apple方法.无论是通过Storyboard视图还是以编程方式在我的代码中.

如果可能的话,我还想避免过于紧密地耦合代码.

最佳答案 我可以通过覆盖NSViewController的viewWillAppear方法来设置视图控制器的表示对象,该方法似乎在将文档实例设置为窗口文档后调用.

- (void)viewWillAppear {
    [super viewWillAppear];

    // Set up the document as the data source
    NSLog(@"viewWillAppear");
    NSWindow *myWindow = [[self view] window];
    NSWindowController *myWindowController = [myWindow windowController];
    CharacterSheetDocument *myDocument = [myWindowController document];
    [self setRepresentedObject: [myDocument characterData]];
}

我不知道这是否是最干净的方法,但确实有效.

对于视图控制器来说,不仅要遍历一系列嵌套的getter来查找模型对象,而且要了解文档的所有子类,这似乎有点笨拙.

点赞