博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
响应者链
阅读量:6998 次
发布时间:2019-06-27

本文共 2853 字,大约阅读时间需要 9 分钟。

hot3.png

 

今天去面试一家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;}

 

 

转载于:https://my.oschina.net/kaqijiang/blog/663501

你可能感兴趣的文章