响应链就是一系列相互关联的对象,响应链中的所有对象都是UIResponder的子类。
一般先去定hitTestView, 确定hiTestView之后,如果hitTestView不能处理该事件,那么事件就会分发到nextResponder,就会顺着响应链往上传递,直到找到一个可以处理的responder为止,nextResponder通常是hitTestView的superView
view的nextResponder通常是他的superview,或是View controller,如果是View controller则VC.view.nextResponder=VC
view controller的nextResponder通常是他所管理的view的superView,VC.nextResponder = VC.view.superView
UIWindow的nextResponder通常是UIApplication
UIApplication的nextResponder通常是它的UIApplication的delegate
应用Tips:可以用nextResponder去找当前app中的任何view controller
找到class类型的类
- (UIResponder *)nextResponderWithClass:(Class) class {
UIResponder *nextResponder = self;
while (nextResponder) {
nextResponder = nextResponder.nextResponder;
if ([nextResponder isKindOfClass:class]) {
return nextResponder;
}
}
return nil;
}
找到当前的first responder
- (UIResponder *)findFirstResponder {
if (self.isFirstResponder) {
return self;
}
for (UIView *subView in self.subviews) {
id responder = [subView findFirstResponder];
if (responder) {
return responder;
}
}
return nil;
}
如果需要一个对象去处理非触摸事件(如摇一摇)等,首先要确保该对象是UIResponder的子类,如果要接受到responder的话还需要做两件事:
重写canBecomeFirstResponder并返回YES;
在需要的时候向该对象发送becomeFirstResponder
应用Tips:用hitTest可以实现不规则View的点击事件处理并作出响应,