iPhone第一响应者

Wil*_*sch 10 iphone first-responder

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

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

但UIView是UIResponder的子类.UIResponder类引用说:

- (BOOL)canBecomeFirstResponder
Run Code Online (Sandbox Code Playgroud)

回报价值

如果接收者可以成为第一响应者,则为是,否则为否.讨论

默认返回NO.如果响应者对象从此方法返回YES,它将成为第一个响应者,并且可以接收触摸事件和操作消息.子类必须覆盖此方法才能成为第一响应者.

我对这个明显的矛盾感到困惑.任何人都可以为我清理它吗?

为了它的价值,我确实设置了一个简单的基于视图的应用程序,并在其视图上调用canBecomeFirstResponder和isFirstResponder.两人都退不了.

Tec*_*Zen 16

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

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

特定类是否继承自NSResonder与类(或类的特定实例)是否将其自身设置为第一响应者/初始事件目标无关.这种能力完全来自实例对canBecomeFirstResponder消息的响应.在一组条件下,同一实例可以拒绝成为第一响应者/初始事件目标,然后在条件发生变化时允许它.如果他们愿意,课程当然可以硬连线.

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


Dav*_*har 9

这意味着基本的UIView无法成为第一响应者 - 它不会对动作事件,编辑菜单消息等做任何事情.

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