在视图控制器中处理发送给第一响应者的消息
Posted
技术标签:
【中文标题】在视图控制器中处理发送给第一响应者的消息【英文标题】:Handling messages to the first responder in a view controller 【发布时间】:2009-10-01 03:49:16 【问题描述】:我一定错过了一些简单的东西,但我看不到它。一、设置:
DATreeView
,NSView
的子类
DATreeViewController
,NSViewController
的子类
MainMenu.xib
有一个DATreeViewController
的实例,配置为从DATreeView.xib
加载视图
MainMenu.xib
也有一个DendreaAppDelegate
的实例,它有一个DATreeViewController
插座(连接到MainMenu.xib
的DATreeViewController
实例。
Do Something!
,一个连接起来的菜单项,用于向第一响应者发送 doSomething:
消息。
并非巧合,DATreeViewController
有一个名为 doSomething:
的操作。
我想要的是让Do Something!
菜单项触发DATreeViewController
上的doSomething:
操作,假设我不能直接设置目标/操作连接。我会在这里停下来问,我的设计完全错误吗?我正在尝试做的事情是愚蠢/邪恶/可能在我的上帝眼中让我感到羞耻吗?
没有?伟大的。现在,对于我的生活,我无法让菜单项处于活动状态。我在 Snow Leopard 上这样做,如果这有什么不同的话。
为了实现NSView
和NSViewController
之间的良好集成,例如管理响应者链,我遵循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
【讨论】:
以上是关于在视图控制器中处理发送给第一响应者的消息的主要内容,如果未能解决你的问题,请参考以下文章