【发布时间】:2016-07-23 21:09:08
【问题描述】:
我正在阅读 UIResponder 类的文档,并且遇到了响应者链。现在据说,例如,当一个命中测试无法处理一个事件时,它会将它传递给一个响应者链。那么,有什么例子可以说明一个事件是如何处理的呢?
【问题讨论】:
标签: ios swift2 hittest uiresponder uievent
我正在阅读 UIResponder 类的文档,并且遇到了响应者链。现在据说,例如,当一个命中测试无法处理一个事件时,它会将它传递给一个响应者链。那么,有什么例子可以说明一个事件是如何处理的呢?
【问题讨论】:
标签: ios swift2 hittest uiresponder uievent
来自Event Handling Guide for iOS
如果初始对象(命中测试视图或第一响应者)不处理事件,UIKit 会将事件传递给链中的下一个响应者。 每个响应者通过调用 nextResponder 方法来决定是要处理事件还是将其传递给自己的下一个响应者。这个过程一直持续到响应者对象处理事件或没有更多响应者为止。
“处理”事件的含义实际上取决于每个响应者类。实现响应者时需要做出的决定是,对于每个事件,是否将其传递给下一个响应者。
该部分的底部还有一个重要说明:
重要提示:如果您实现自定义视图来处理远程控制事件、动作消息、使用 UIKit 的摇动事件或编辑菜单消息,请不要将事件或消息转发给 nextResponder直接将其发送到响应者链。相反,调用当前事件处理方法的超类实现,让 UIKit 为您处理响应者链的遍历。
同样,对于最常见的情况,您的响应者是处理触摸事件的 UIView 子类,所有这些方法包括:
这个方法的默认实现什么都不做。然而,UIResponder 的直接 UIKit 子类,尤其是 UIView,将消息向上转发到响应者链。要将消息转发给下一个响应者,请将消息发送给 super(超类实现);不要将消息直接发送给下一个响应者。例如,
[super touchesBegan:touches withEvent:event];如果您在不调用 super(一种常用模式)的情况下覆盖此方法,则还必须覆盖其他用于处理触摸事件的方法,如果只是作为存根(空)实现。
【讨论】: