2010-09-07 60 views
0

我正在使用自定义子类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]覆盖返回的字符串;我只是把它放在那里看看它是否被调用。但是,docplotClicked为空。

我可能做错了什么?

编辑:我相信问题是与NIBs。如上所述,我的文档拥有自己的NIB,并将文件所有者设置为自定义控制器。从MainMenu.xib中的菜单项触发plotClicked操作。我相信它正在创建一个与当前活动文档无关的新控制器实例。

那么,我如何链接两个?我的问题是这样的:如何从MainMenu.xib获取当前活动文档(或其窗口控制器)的句柄?

感谢

回答

1

我的文档有它自己的NIB,文件的所有者设置为自定义控制器,如上所述。

文件夹的文件所有者应该是文件。考虑一下嫌疑犯#1。

从MainMenu.xib的菜单项触发plotClicked操作。我相信它正在创建一个与当前活动文档无关的新控制器实例。

您是否在您的主菜单笔尖内放置了一个窗口控制器?如果不是,那么这不是问题,因为您必须将您的plotClicked:菜单项连接到First Responder,并且窗口控制器及其文档将位于响应者链中。

如果你这样做,那么有一个解决方案:从MainMenu笔尖删除窗口控制器,并将你的菜单项连接到First Responder,以便动作消息沿响应者链下去,这将使它能够击中文件或窗口控制器。

如何获得...的句柄?

Mac上唯一的句柄来自碳;这些把手不存在可可。

+0

彼得,谢谢。我确实有一个窗口控制器,随后我将其移除。我现在已经将菜单项连接到First Responder,它现在可以工作。我不确定*为什么*它的工作原理:我知道该事件正在流向响应者链,但在窗口控制器上的操作plotClicked在文档笔尖中未连接。我需要阅读更多关于这个。 – 2010-09-07 17:33:57

+0

你说文件的所有者应该是文件。使用自定义窗口控制器的情况仍然如此吗?如果是这样,我如何访问NIB中的控制器?我不认为在文档NIB中实例化自定义窗口控制器是正确的。感谢您先前明确回答了一个非常模糊的问题。 – 2010-09-07 17:36:40

+0

您不需要在任何nib中实例化窗口控制器,因为它的任务是加载nib。为什么要从笔尖中的物体访问控制器,而不是文档? – 2010-09-07 17:38:38

0

init不是NSWindowController的指定初始化。您需要其中的一个:– initWithWindow:,– initWithWindowNibName:,– initWithWindowNibName:owner:– initWithWindowNibPath:owner:

此外,从the docs

在你的类的初始化方法, 一定要调用的超一方 的initWithWindowNibName的:... 初始化或initWithWindow: 初始化。哪一个取决于 窗口对象是否在nib文件中创建了 或者以编程方式创建了 。

+0

谢谢,虽然我不认为这是因为我的'init'方法包含对'[super initWithWindowNibName:@“TKDocument”]'的调用。如果更好的做法,我将直接从Document调用'initWithWindowNibName',并在Controller中覆盖它以执行其他初始化。 – 2010-09-07 16:47:14

+0

TimG:如果您的自定义'init'调用NSWindowController的初始值设定项之一,则可以调用您的自定义'init'。 – 2010-09-07 17:15:13