我正在使用NSDocument
的自定义子类和NSWindowController
的自定义子类。问题是我无法从自定义窗口控制器中引用我的自定义文档。
在IB中,在TKDocument
NIB中,我将文件所有者设置为TKWindowController
。
在我的TKDocument
子类中,我有:
- (void) makeWindowControllers {
TKWindowController *controller = [[TKWindowController alloc] init];
[self addWindowController:controller];
}
然后在我的TKWindowController
子类中,我覆盖setDocument
以确保它被调用:
- (void) setDocument(NSDocument *) document {
NSLog(@"setDocument:%@", document);
[super setDocument:document];
}
然后(再次在TKWindowController
中)我的行动引用文件本身:
- (IBAction) plotClicked:(id) sender {
TKDocument *doc = [self document];
NSLog(@"plotClicked %@", doc);
}
setDocument
中的NSLog输出我[TKDocument description]
覆盖返回的字符串,正如我所期望的那样;我只是把它放在那里,看它是否被调用。但是,doc
中的plotClicked
为空。
我可能做错了什么?
编辑:我认为问题与NIB有关。我的文档有自己的NIB,文件所有者设置为自定义控制器,如上所述。从MainMenu.xib中的菜单项触发plotClicked
操作。我相信它正在触及与当前活动文档无关的控制器的新实例。
那么,我如何将这两者联系起来呢?我的问题是:我如何从MainMenu.xib获取当前活动文档(或其窗口控制器)的句柄?
由于
答案 0 :(得分:1)
我的文档有自己的NIB,文件所有者设置为自定义控制器,如上所述。
文档笔尖的文件所有者应该是文档。考虑一下嫌犯#1。
plotMed动作是从MainMenu.xib中的菜单项触发的。我相信它正在触及与当前活动文档无关的控制器的新实例。
您是否在主菜单笔尖内放置了一个窗口控制器?如果没有,那么这不是问题,因为你必须将plotClicked:菜单项连接到First Responder,窗口控制器及其文档将在响应者链中。
如果你这样做,那么就有了解决方案:从MainMenu笔尖中删除窗口控制器并将菜单项连接到First Responder,以便操作消息沿着响应者链向下,这将使其能够命中文档或窗口控制器。
如何获得...的句柄?
Mac上唯一的Handles来自Carbon; Cocoa中不存在那些句柄。
答案 1 :(得分:0)
init
不是NSWindowController的指定初始值设定项。您需要以下其中一项:– initWithWindow:
,– initWithWindowNibName:
,– initWithWindowNibName:owner:
或– initWithWindowNibPath:owner:
。
此外,来自the docs:
在你班级的初始化方法中, 一定要调用super initWithWindowNibName的内容:... 初始化器或initWithWindow: 初始化。哪一个取决于 窗口对象是否来源 在nib文件中或以编程方式 创建