野火🔥

生命如野火,骄傲而顽强

UIResponder 响应链 拾遗

背景

基于ResponderChain可以做一些事件传递,将所有view的操作最终都送回到ViewController来处理,以实现view的功能单一性。如下:

@interface UIResponder (Router)
- (void)routerEventWithName:(NSString *)eventName userInfo:(NSDictionary *)userInfo;
@end

@implementation UIResponder (Router)
- (void)routerEventWithName:(NSString *)eventName userInfo:(NSDictionary *)userInfo
{
    [[self nextResponder] routerEventWithName:eventName userInfo:userInfo];
}
@end

每个cell在做事件请求时,只需要调用routerEventWithName:userInfo:,即可将请求传递给对应的ViewController(也可以是响应链任意一环),然后用EventName来区分事件类型。

ChildViewController

一般来讲 view.nextResponder = view.superView。ViewController的root view的nextResponder是当前ViewController,那childViewController的view的nextResponder是谁呢?如果用nextResponder拦截,childViewController能拦截到其中的view的响应吗?

XCode实测:

  • 如果addChildViewController:

childVC.view.nextResponder == childVC,childVC.nextResponder == childVC.view.superView,相当于在subView&superView的响应联调中,插入了一个VC,与window和VC.view的关系是一致的。

Categories:  技术 

« 17年的总结 博客继续记录 »