2

我一定错过了一些简单的东西,但我看不到它。首先,设置:

  • DATreeView, 的一个子类NSView
  • DATreeViewController, 的一个子类NSViewController
  • MainMenu.xib有一个 的实例DATreeViewController,它被配置为从DATreeView.xib
  • MainMenu.xib还有一个 的实例DendreaAppDelegate,它有一个DATreeViewController插座(连接到MainMenu.xib' 的DATreeViewController实例。
  • Do Something!,一个连接起来的菜单项,用于向doSomething:第一响应者发送消息。
  • 并非巧合,DATreeViewController有一个动作叫doSomething:.

我想要的是Do Something!菜单项触发doSomething:操作DATreeViewController,让我们假设我不能直接设置目标/操作连接。我会在这里停下来问,我的设计完全错误吗?我正在尝试做的事情是愚蠢/邪恶/可能在我的上帝眼中让我感到羞耻吗?

不?伟大的。现在,对于我的生活,我无法让菜单项处于活动状态。我在 Snow Leopard 上这样做,如果这有什么不同的话。

为了实现NSView和之间的良好集成NSViewController,例如管理响应者链,我遵循了Matt Gallagher 的示例,进行了一项实质性更改:在 NIB 加载过程中NSView似乎没有收到setViewController:消息,所以我自己发送该消息DATreeViewControllerloadView讯息。据我所知,在运行以下代码后applicationDidFinishLaunching:

NSView *view = self.treeViewController.view;
[self.window.contentView addSubview:view];

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

NSWindow < NSView < DATreeViewController < DATreeView

我的期望是,作为DATreeViewController响应者链的一部分,作为响应者链的一部分,作为响应者doSomething:,并且因为它不实现验证,我所要做的就是使用 Interface Builder 将Do Something!菜单项连接到 First Responder 代理,doSomething:作为其操作,菜单项将自动激活。

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

4

3 回答 3

3

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

于 2009-10-01T05:22:24.823 回答
0

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

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

于 2009-10-01T05:24:20.127 回答
0

响应者链仅适用于NSResponder超类中的消息,例如mouseDown mouseExitedetc。我相信您可以通过添加一个类别来做一些鬼鬼祟祟的事情,NSResponder通过查看nextResponder并发送消息(如果nextResponder存在)来冒泡其他方法。

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

于 2016-04-26T21:48:22.230 回答