响应者对象
响应者对象是一个能够接受并处理事件的对象。UIResponser是所有响应者对象的积累。该基类定义了一系列编程接口。不但为事件处理进行服务而且还提供了通用的响应行为处理。
UIApplication,UIView,UIViewController都直接或者间接地继承自UIResponser,所有的这些类的实例都是响应者对象。
响应者链处理原则
- 点击检测视图或者第一响应者传递事件或动作消息给它的视图控制器(如果它有的话);如果没有一个视图控制器,就传递给它的父视图。
- 如果一个视图或者它的视图控制器不能处理这个事件或动作消息,它将传递给该视图的父视图。
- 在这个视图层次中的每个后续的父视图遵循上述的模式,如果它不能处理这个事件或动作消息的话。
- 最顶层的视图如果不能处理这个事件或动作消息,就传递给UIWindow对象来处理。
- 如果UIWindow 对象不能处理,就传给单件应用程序对象UIApplication。
如果应用程序对象也不能处理这个事件或动作消息,将抛弃它。
问题: 如果我们想给自定义的UITableViewCell里的UIImageView或者其他类型的视图添加一个点击事件,然后进行跳转。我们该如何处理呢?
解决如下:
@implementation UIView (AliResponder)
- (UIViewController *)viewController {
UIResponder *nextResponder = [self nextResponder]; //获取当前uiview的下一个事件响应者
do {
if ([nextResponder isKindOfClass:[UIViewController class]]) { //如果当前的事件响应者具备push方法,也就是属于
return (UIViewController *)nextResponder; //UIViewController,返回UIViewController
}
nextResponder = [nextResponder nextResponder]; //否则一直寻找下一个响应者
} while (nextResponder);
return nil;
}