当然直接调用mysubview.superView也可,但有时子view是不一定知道有这个特定的父view存在的,如动态加子view。
所里这里就可以用到消息响应链技术。
让子view接受到这些事件后,同时把这些事件继续向上传,会一直传到UIAppllication为止。而在传得过程中,如果子view接收了这些事件,那么事件会自然终止,现在可以做的是同时让子view接收事件,而且还让事件不终止,并继续向上传。
说明:
当用户与IPhone的触摸屏产生互动时,硬件就会探测到物理接触并且通知操作系统。接着操作系统就会创建相应的事件并且将其传递给当前正在运行的应用程序的事件队列。然后这项事件会被事件循环传递给优先响应者物件。优先相应者物件是事件被触发时和用户交互的物件,比如按钮物件、视图物件。如果我们编写了代码让优先响应者处理这种类型的事件,那么它就会处理这种类型的事件。处理完某项事件后,响应者有两个选项:1将其丢弃;2将其传递给相应链条中的下一个响应者。下一个响应者的地址存储在当前响应物件所包含的变量nextResponder当中。如果优先响应者无法处理一项事件,那么这项事件就传递给下一个响应者,直到这项事件到达能处理它的响应者或者到达响应链条的末端,也就是UIApplication类型的物件。UIApplication类型的物件收到一项事件后,也是要么处理,要么丢弃。
比如有一个视图物件,这个视图物件上有一个按钮物件。当用户触摸这个按钮物件时,作为优先响应者,这个按钮物件就会收到一项事件。如果这个按钮物件无法处理这项事件,就会被这项事件传递给视图物件。如果视图物件无法处理这项事件,就会将这项事件传递给视图控制器物件。依次类推。
应该注意的是当我们在使用响应链条时,一项事件并不会自动地从一个响应者传递到下一个响应者。如果要将一项事件从一个响应者传递到下一个响应者,必须编写代码才能办到。
子view的代码如下:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[[self nextResponder] touchesBegan:touches withEvent:event];
}