我正在开发一个简单的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来查找模型对象,而且要了解文档的所有子类,这似乎有点笨拙.