首页 > 代码库 > 响应者和响应者链

响应者和响应者链

核心的应用程序对象-NSApplicationNSWindow、和NSView-都是响应者,它们是NSResponder(参见图6-19)的直接或间接子类的实例。这个抽象类定义了能够响应事件的对象的接口和期望的行为。NSResponder的子类完全或部分实现了这个行为。


图6-19  NSResponder及其直接子类


请注意:还有其它两个Application Kit类直接继承自NSResponderNSWindowControllerNSDrawer。虽然NSWindowController是Cocoa文档架构的一部分(参见"其它Cocoa架构"部分的描述),这两个类都不是核心Cocoa应用程序架构的中心。

NSResponder类为核心应用程序架构的三个主要模式或机制定义了一个接口:

  • 它声明了一些处理事件消息(也就是源自用户事件的消息,比如象鼠标点击或按键按下这样的事件)的方法。

  • 它声明了数十个处理动作消息的方法,它们和标准的键绑定(比如那些在文本内部移动插入点的绑定)密切相关。动作消息会被派发到目标对象;如果目标没有被指定,应用程序会负责检索合适的响应者。

  • 它定义了一套在应用程序中指派和管理响应者的方法。这些响应者组成了我们所知道的响应者链-即一系列响应者,事件或动作消息在它们之间传递,直到找到能够对它们进行处理的对象。

响应者链是Application Kit事件处理架构的中心机制。它由一系列链接在一起的响应者对象组成,事件或者动作消息可以沿着这些对象进行传递。如图6-20显示的那样,如果一个响应者对象不能处理某个事件或动作-也就是说,它不响应那个消息,或者不认识那个事件,则将该消息重新发送给链中的下一个响应者。消息沿着响应者链向上、向更高级别的对象传递,直到最终被处理(如果最终还是没有被处理,就会被抛弃)。


图6-20  响应者链


当Application Kit在应用程序中构造对象时,会为每个窗口建立响应者链。响应者链中的基本对象是NSWindow对象及其视图层次。在视图层次中级别较低的视图将比级别更高的视图优先获得处理事件或动作消息的机会。NSWindow中保有一个第一响应者的引用,它通常是当前窗口中处于选择状态的视图,窗口通常把响应消息的机会首先给它。对于事件消息,响应者链通常以发生事件的窗口对应的NSWindow对象作为结束,虽然其它对象也可以作为下一个响应者被加入到NSWindow对象的后面。

对于动作消息,响应者链则比较复杂。有以下两个因素决定了动作消息的响应者链:

  • 如果应用程序当前既有主窗口,也有键盘焦点窗口,则两个窗口的响应者链都会参与,其中键盘焦点窗口的响应者链首先获得处理动作的机会。在每一个窗口链的最后,Cocoa会给NSWindow的委托对象响应动作的机会;在合并的响应者链的最后是NSApp以及它的委托对象。

  • 应用程序的类型-是简单的基于文档的程序,还是使用窗口控制器的程序-这决定链中的响应者对象的类型和位置。

NSResponder类也包含有错误表示和恢复、消息派发、应用程序帮助、以及实现其它功能的方法。

==============================邪恶的分割线==============================

以上是Apple的官方文档,地址是:

http://www.apple.com.cn/developer/mac/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CoreAppArchitecture/chapter_7_section_6.html

理解以上要注意以下几点:

1、以上文档介绍的是MAC OS X 下的响应者和响应者链的相关逻辑,这个和IOS中的逻辑是基本相同的,只是实现的类不一样而已。

2、NSApplicationNSWindow、和NSView 分别对应了 IOS 中的UIApplication、UIWindow、和UIView.


3、当Application Kit在应用程序中构造对象时,会为每个窗口建立响应者链,同样的在 IOS中对应的是 UIKit这个框架,IPhone的应用程序就一个窗口,所以只会有一个响应

     者链。