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

Posted

技术标签:

【中文标题】在视图控制器中处理发送给第一响应者的消息【英文标题】:Handling messages to the first responder in a view controller 【发布时间】:2009-10-01 03:49:16 【问题描述】:

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

DATreeViewNSView 的子类 DATreeViewControllerNSViewController 的子类 MainMenu.xib 有一个DATreeViewController 的实例,配置为从DATreeView.xib 加载视图 MainMenu.xib 也有一个DendreaAppDelegate 的实例,它有一个DATreeViewController 插座(连接到MainMenu.xibDATreeViewController 实例。 Do Something!,一个连接起来的菜单项,用于向第一响应者发送 doSomething: 消息。 并非巧合,DATreeViewController 有一个名为 doSomething: 的操作。

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

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

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

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

响应者链按预期建立,即:

NSWindow < NSView < DATreeViewController < DATreeView

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

啊!由于该操作在视图控制器中,因此我覆盖了 -acceptsFirstResponder。但是视图控制器不在视图层次结构中!谢谢!【参考方案2】:

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

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

【讨论】:

原来它比这更简单。由于该操作在视图控制器中,因此我覆盖了 -acceptsFirstResponder。但是 Cocoa 只查看响应者的视图层次结构,而 DAView 不接受第一响应者...【参考方案3】:

响应者链仅适用于 NSResponder 超类中的消息,例如 mouseDown mouseExited 等。我相信您可以通过向 NSResponder 添加类别来做一些鬼鬼祟祟的事情,通过查看nextResponder 并在 nextResponder 存在时发送消息。

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

【讨论】:

以上是关于在视图控制器中处理发送给第一响应者的消息的主要内容,如果未能解决你的问题,请参考以下文章

NSTextView:在故事板应用程序中辞职第一响应者

视图控制器何时会成为第一响应者?

如果不是初始视图控制器,则向第一响应者发送操作不起作用

响应者链的事件传递过程

hook 鼠标键盘消息实例分析

当 UISearchBar 成为横向的第一响应者时,模态视图移动