我正在使用自定义子类NSDocument
和自定义子类NSWindowController
。问题是我无法从我的自定义窗口控制器中引用我的自定义文档。在NSWindowController子类中,[self document]返回null
在IB中,在TKDocument
NIB中,我将文件所有者设置为TKWindowController
。
在我TKDocument
子,我有:(在TKWindowController
再次)
- (void) setDocument(NSDocument *) document {
NSLog(@"setDocument:%@", document);
[super setDocument:document];
}
,然后我的行动:
- (void) makeWindowControllers {
TKWindowController *controller = [[TKWindowController alloc] init];
[self addWindowController:controller];
}
然后在我的TKWindowController
子我推翻setDocument
,以确保它被称为其中引用文件本身:
- (IBAction) plotClicked:(id) sender {
TKDocument *doc = [self document];
NSLog(@"plotClicked %@", doc);
}
如我所料,NSLog输出我的[TKDocument description]
覆盖返回的字符串;我只是把它放在那里看看它是否被调用。但是,doc
在plotClicked
为空。
我可能做错了什么?
编辑:我相信问题是与NIBs。如上所述,我的文档拥有自己的NIB,并将文件所有者设置为自定义控制器。从MainMenu.xib中的菜单项触发plotClicked
操作。我相信它正在创建一个与当前活动文档无关的新控制器实例。
那么,我如何链接两个?我的问题是这样的:如何从MainMenu.xib获取当前活动文档(或其窗口控制器)的句柄?
感谢
彼得,谢谢。我确实有一个窗口控制器,随后我将其移除。我现在已经将菜单项连接到First Responder,它现在可以工作。我不确定*为什么*它的工作原理:我知道该事件正在流向响应者链,但在窗口控制器上的操作plotClicked在文档笔尖中未连接。我需要阅读更多关于这个。 – 2010-09-07 17:33:57
你说文件的所有者应该是文件。使用自定义窗口控制器的情况仍然如此吗?如果是这样,我如何访问NIB中的控制器?我不认为在文档NIB中实例化自定义窗口控制器是正确的。感谢您先前明确回答了一个非常模糊的问题。 – 2010-09-07 17:36:40
您不需要在任何nib中实例化窗口控制器,因为它的任务是加载nib。为什么要从笔尖中的物体访问控制器,而不是文档? – 2010-09-07 17:38:38