今天去面试一家360和磊科投资的公司的时候,
面试官问了我一下响应者链的问题。让我说一下怎么写的竟然突然忘记了。
现在拿出来继续学习下好了。
1、创建个分类
//找到视图以及子类对象的响应者链条中的视图控制器extension UIView { //查找响应者链条中的导航视图控制器 func navController() -> UINavigationController? { var next = nextResponder() //遍历响应者链条 while next != nil { if let nav = next as? UINavigationController { return nav } //如果下一个响应者不是导航视图控制器 //查找下一个响应者下一个响应者 next = next?.nextResponder() } return nil }}
2、去调用这个分类的,寻找到对应的响应者,执行操作。(注意push出来后背景颜色问题)
class demoView: UIView { //MARK: 按钮的监听事件 @objc private func repostBtnDidClikc() { //页面跳转 let temp = TempViewController() //设置底部tabbar隐藏 temp.hidesBottomBarWhenPushed = true //使用导航视图控制 跳转页面 navController()?.pushViewController(temp, animated: true) }
OC版本
//1.提供一个UIView的分类方法,这个方法通过响应者链条获取view所在的控制器
- (UIViewController *)parentController { UIResponder *responder = [self nextResponder]; while (responder) { if ([responder isKindOfClass:[UIViewController class]]) { return (UIViewController *)responder; } responder = [responder nextResponder]; } return nil;}
//2.通过控制器的布局视图可以获取到控制器实例对象(modal的展现方式需要取到控制器的根视图)
+ (UIViewController *)currentViewController{UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;// modal展现方式的底层视图不同// 取到第一层时,取到的是UITransitionView,通过这个view拿不到控制器UIView *firstView = [keyWindow.subviews firstObject];UIView *secondView = [firstView.subviews firstObject];UIViewController *vc = secondView.parentController;if ([vc isKindOfClass:[UITabBarController class]]){UITabBarController *tab = (UITabBarController *)vc;if ([tab.selectedViewController isKindOfClass:[UINavigationController class]]){UINavigationController *nav = (UINavigationController *)tab.selectedViewController;return [nav.viewControllers lastObject];}else{return tab.selectedViewController;}}else if([vc isKindOfClass:[UINavigationController class]]){UINavigationController *nav = (UINavigationController *)vc;return [nav.viewControllers lastObject];}else{return vc;}return nil;}//- (UIViewController *)getCurrentVC{UIViewController *result = nil;UIWindow * window = [[UIApplication sharedApplication] keyWindow];if (window.windowLevel != UIWindowLevelNormal){NSArray *windows = [[UIApplication sharedApplication] windows];for(UIWindow * tmpWin in windows){if (tmpWin.windowLevel == UIWindowLevelNormal){window = tmpWin;break;}}}UIView *frontView = [[window subviews] objectAtIndex:0];id nextResponder = [frontView nextResponder];if ([nextResponder isKindOfClass:[UIViewController class]])result = nextResponder;elseresult = window.rootViewController;return result;}