我必须遗漏一些简单的东西,但我看不到它。首先,设置:
DATreeView
,NSView
DATreeViewController
,NSViewController
MainMenu.xib
的实例为DATreeViewController
,其配置为从DATreeView.xib
加载视图MainMenu.xib
还有一个DendreaAppDelegate
的实例,其中有DATreeViewController
个插座(连接到MainMenu.xib
的{{1}}个实例。DATreeViewController
,这是一个连接的菜单项,用于向第一响应者发送Do Something!
消息。doSomething:
有一项名为DATreeViewController
的行动。我想要的是doSomething:
菜单项在Do Something!
上触发doSomething:
操作,让我们假装我不能直接设置目标/操作连接。我会在这里停下来问,我的设计完全错了吗?是我在做什么愚蠢/邪恶/可能在我的上帝眼中羞辱我?
没有?大。现在,对于我的生活,我无法让菜单项生效。我在Snow Leopard上这样做,如果这有任何区别的话。
为了实现DATreeViewController
和NSView
之间的良好整合,例如管理响应者链,我跟着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:
为操作,菜单项将自动激活。
我做错了什么?谢谢大家的宝贵帮助!
答案 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