我对iPhone响应链感到困惑。具体来说,在iPhone事件处理指南http://developer.apple.com/iPhone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/EventHandling/EventHandling.html中,我们有以下内容:
第一个响应者是应用程序中的响应者对象(通常是UIView对象),被指定为触摸事件以外的事件的第一个接收者。 的
但是UIView是UIResponder的子类。 UIResponder类引用说:
- (BOOL)canBecomeFirstResponder
返回值
如果接收者可以成为第一响应者,则为是,否则为否。 讨论
默认返回NO。如果响应者对象从此方法返回YES,它将成为第一个响应者,并且可以接收触摸事件和操作消息。子类必须覆盖此方法才能成为第一响应者。
我对这个明显的矛盾感到困惑。任何人都可以为我清理它吗?
为了它的价值,我确实设置了一个简单的基于视图的应用程序,并在其视图上调用canBecomeFirstResponder和isFirstResponder。两人都返回NO。
答案 0 :(得分:16)
命名法可能令人困惑。而不是“第一响应者”将其视为“初始事件目标”,即作为第一响应者的对象成为所有事件的初始目标。在某些API中,这也称为“焦点”,尽管在Apple API中通常用于描述窗口。
在任何给定时间,应用程序中只有一个第一响应者/初始事件目标。只有单个对象/实例才能成为第一响应者/初始事件目标。类只能定义它们的实例是否有能力成为第一响应者/初始事件目标。如果有意义的话,类只需要提供成为应用程序的第一响应者/初始事件目标的能力。例如,文本字段显然需要能够捕获事件,以便它可以使用这些事件来编辑自身。相比之下,静态标签不需要这样的能力。
特定类是否继承自NSResonder与类(或类的特定实例)是否将其自身设置为第一响应者/初始事件目标无关。该功能仅来自实例对canBecomeFirstResponder
消息的响应。在一组条件下,同一实例可以拒绝成为第一响应者/初始事件目标,然后在条件发生变化时允许它。如果他们愿意,课程当然可以硬连线。
换句话说,第一响应者/初始事件目标是特定时间的特定实例的状态。第一响应者/初始事件目标就像是烫手山芋或在UI中从实例切换到实例的令牌。有些班级拒绝抓住烫手山芋。有些人总是这样做,而其他人有时会抓住它而忽略其他人。
答案 1 :(得分:9)
这意味着基本的UIView无法成为第一响应者 - 它不会对动作事件,编辑菜单消息等做任何事情。
一些UIView子类(比如UITextView)能够成为第一个响应者,你也可以编写自己的UIView子类。