10

我对 iPhone 响应者链感到困惑。具体来说,在 iPhone 事件处理指南http://developer.apple.com/iPhone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/EventHandling/EventHandling.html中,我们有以下内容:

第一个响应者是应用程序中的响应者对象(通常是 UIView 对象),它被指定为除触摸事件之外的事件的第一个接收者。

但是 UIView 是 UIResponder 的子类。UIResponder 类参考是这样说的:

- (BOOL)canBecomeFirstResponder

返回值

如果接收者可以成为第一响应者,则为 YES,否则为 NO。讨论

默认返回 NO。如果响应者对象从此方法返回 YES,则它成为第一响应者并可以接收触摸事件和动作消息。子类必须重写此方法才能成为第一响应者。

我对明显的矛盾感到困惑。谁能帮我清理一下?

值得一提的是,我确实设置了一个简单的基于视图的应用程序,并在其视图上调用 canBecomeFirstResponder 和 isFirstResponder。两者都返回NO。

4

2 回答 2

16

命名法可能会令人困惑。而不是“第一响应者”将其视为“初始事件目标”,即作为第一响应者的对象成为所有事件的初始目标。在某些 API 中,这也称为“焦点”,尽管在通常保留用于描述窗口的 Apple API 中。

在任何给定时间,应用程序中只有一个第一响应者/初始事件目标。只有单个对象/实例可以成为第一响应者/初始事件目标。类只能定义它们的实例是否有能力成为第一响应者/初始事件目标。一个类只需要提供成为应用程序的第一响应者/初始事件目标的能力,如果这样做是有意义的。例如,文本字段显然需要捕获事件的能力,以便它可以使用这些事件来编辑自己。相比之下,静态标签不需要这种能力。

特定类是否继承自 NSResonder 与该类(或该类的特定实例)是否会让自己被设置为第一响应者/初始事件目标无关。该能力仅来自个体对canBecomeFirstResponder消息的响应。同一个实例可以在一组条件下拒绝成为第一响应者/初始事件目标,然后在条件发生变化时允许它。如果他们愿意,类当然可以硬连线状态。

换句话说,第一响应者/初始事件目标是特定实例在特定时间的状态。第一响应者/初始事件目标就像烫手山芋或令牌,在 UI 中从一个实例传递到另一个实例。有些班级根本拒绝抢夺烫手山芋。有些人总是这样做,有些人有时会抓住它,而另一些人则忽略它。

于 2010-04-10T04:55:54.943 回答
9

这意味着基本的 UIView 不能成为第一响应者——它不会对运动事件、编辑菜单消息等做任何事情。

一些 UIView 子类(如 UITextView)能够成为第一响应者,您也可以编写自己的 UIView 子类。

于 2010-04-10T03:51:46.743 回答