响应者和响应者链

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


图6-19  NSResponder及其直接子类架构


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

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

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

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

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

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


图6-20  响应者链htm


当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

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

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

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


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

     者链。

相关文章
相关标签/搜索