wol*_*eth 5 cocoa objective-c nsdocument nsviewcontroller
我正在开发一个简单的 OS X Cocoa 应用程序,其中用户填写表单,应用程序执行一些在其他字段中弹出的计算。
我从 Xcode 6.3.2(适用于 Yosemite)上默认的基于文档的应用程序模板开始。该模板包含 NSDocument 的子类和 NSViewController 的子类。该接口在 Storyboard 中定义。NSDocument 在 makeWindowControllers 中从 Storyboard 初始化接口。
我在将接口片段绑定到 ViewController 的representedObject 时遇到了麻烦——结果我绑定到了 nil。ViewController 的 setRepresentedObject 方法永远不会被调用。
我尝试让 ViewController 在 viewDidLoad 中调用 setRepresentedObject 本身,但当时尚未设置 WindowController 的文档属性(它返回 nil)。
我不清楚是否可以从 NSDocument 获取 ViewController 的实例 - NSDocument 知道它的 window/WindowController,但我不确定如何从这些类中找到 ViewController。
我想知道 Xcode/Apple 的惯用方式来做到这一点。无论是通过故事板视图还是在我的代码中以编程方式实现。
如果可能的话,我还想避免代码耦合得太紧密。
我能够通过重写 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 来查找模型对象,还要了解有关文档子类的所有信息,这似乎有点笨重。
| 归档时间: | 
 | 
| 查看次数: | 3223 次 | 
| 最近记录: |