在NSWindowController子类中,[self document]返回null

时间:2010-09-07 14:53:25

标签: cocoa

我正在使用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获取当前活动文档(或其窗口控制器)的句柄?

由于

2 个答案:

答案 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文件中或以编程方式   创建