在视图控制器中处理消息给第一响应者

时间:2009-10-01 03:49:17

标签: objective-c cocoa nsview first-responder nsviewcontroller

我必须遗漏一些简单的东西,但我看不到它。首先,设置:

  • DATreeViewNSView
  • 的子类
  • DATreeViewControllerNSViewController
  • 的子类
  • MainMenu.xib的实例为DATreeViewController,其配置为从DATreeView.xib加载视图
  • MainMenu.xib还有一个DendreaAppDelegate的实例,其中有DATreeViewController个插座(连接到MainMenu.xib的{​​{1}}个实例。
  • DATreeViewController,这是一个连接的菜单项,用于向第一响应者发送Do Something!消息。
  • 并非巧合,doSomething:有一项名为DATreeViewController的行动。

我想要的是doSomething:菜单项在Do Something!上触发doSomething:操作,让我们假装我不能直接设置目标/操作连接。我会在这里停下来问,我的设计完全错了吗?是我在做什么愚蠢/邪恶/可能在我的上帝眼中羞辱我?

没有?大。现在,对于我的生活,我无法让菜单项生效。我在Snow Leopard上这样做,如果这有任何区别的话。

为了实现DATreeViewControllerNSView之间的良好整合,例如管理响应者链,我跟着Matt Gallagher's example,做了一个实质性的改变:在NIB加载过程中,NSViewController似乎没有收到NSView消息,所以我发送了这条消息我自己在setViewController:的{​​{1}}消息中。据我所知,在DATreeViewController

中运行以下代码之后
loadView

响应者链按预期设置,即:

applicationDidFinishLaunching:

我的期望是,由于NSView *view = self.treeViewController.view; [self.window.contentView addSubview:view]; 是响应者链的一部分,并且响应NSWindow < NSView < DATreeViewController < DATreeView ,并且因为它没有实现验证,所以我所要做的就是使用Interface Builder将DATreeViewController菜单项连接到First Responder代理,并以doSomething:为操作,菜单项将自动激活。

我做错了什么?谢谢大家的宝贵帮助!

3 个答案:

答案 0 :(得分:3)

您的观点是否接受并成功成为第一响应者?

答案 1 :(得分:0)

DATreeViewController是否连接到IB中的DATreeView的viewController插座?

您是否通过setViewController跟踪:和setNextResponder:来验证nextResponder是否正确设置?

答案 2 :(得分:0)

响应者链仅适用于NSResponder超类中的消息,例如mouseDown mouseExited等。我相信您可以通过向NSResponder添加类别来偷偷摸摸地执行某些操作通过查看nextResponder并在nextResponder存在时发送消息来冒充其他方法。

这似乎是这种技术的一个例子:https://github.com/MrNoodle/NoodleKit/blob/master/NSResponder-NoodleModalExtensions.m