iOS 事件传递那些事

iOS  中究竟消息是如何传递的,点击一个按钮到执行对应方法这个过程都经历了哪些?这些就要去看UIResponder 这个类。这是一个专门用来响应和处理事件的一个类,继承自NSObject 类,也是UIView、UIApplication (包括他们的子类)的父类。

iOS中事件分为三类:触控事件 传感器事件 远程控制事件。我们大部分时间用到的都是触控事件,就先来了解下触控事件。我们所见到的包括UIBtton UIImageView UIViewController 这些都是responder 对象。Gesture Recognizers是一个手势识别器对象,每一个Gesture Recognizers 都关联着一个view,附属在指定的view上面,并且为其设定指定的手势操作。当触控事件发生后,view会通过Gesture Recognizers去拦截该事件,如果这个事件是view 事先设定的监听事件。Gesture Recognizers就发送动作消息(action message)给目标对象(target)。并且在发生触控事件的时候,Gesture Recognizers要先于view(responder对象)本身接收到这个事件消息。换句话说当Gesture Recognizer接收到指定的事件时,它就会发送一条动作消息(action message)给target处理。

如下图,就是iOS 中事件传递的路径


iOS 事件传递那些事_第1张图片

先是app 接收到消息,传递给window,window会同时传递给Gesture Recognizers和view(responder对象)。但是如果Gesture Recognizers识别出传递过来的事件,就不会再传给view。事件传递到达Gesture Recognizers或是view以后。就会按照一个responder chain 的事件链向下传递到下一个responder,即next responder。

先讲讲这个responder chain,它是一系列连接的responder对象,通过responder 对象将事件处理传递给写一个responder 对象或者说更高级的对象,即next responder 对象。

*UIView的nextResponder属性,如果有管理此view的UIViewController对象,则为此UIViewController对象(利用这个可以通过nextResponder属性找到view关联的viewController);否则nextResponder即为其superview。

*UIViewController的nextResponder属性为其管理view的superview.

*UIWindow的nextResponder属性为UIApplication对象。

*UIApplication的nextResponder属性为nil。

所以说,触控事件发生后如果负责处理这个事件的responder 不处理该事件,则事件通过事件链被传递到下一个responder,直至传递到UIApplication,如果UIApplication也不处理则事件被丢弃。


最后说个小技巧,事件不响应的几个可能原因:

userInteractionEnabled = NO

hidden = YES

alpha = 0.0 ~ 0.01

欢迎指正。

你可能感兴趣的:(iOS 事件传递那些事)