iOS:关于获取当前控制器的方法

在做项目时,有时候,会写一个工具类来对项目进行操作:
这个时候如果需要使用当前控制器去进行一些操作,比如想去present一个alertController,
这时候就需要获取到当前控制器了,下面就是获取的方法:根据每个App都是一个单例来获取当前窗口的根控制器,从而获取到所有的控制器,找到

+ (UIViewController *)getCurrentVC {
    
    UIWindow *window = [[UIApplication sharedApplication].windows firstObject];
    if (!window) {
        return nil;
    }
    UIView *tempView;
    for (UIView *subview in window.subviews) {
        if ([[subview.classForCoder description] isEqualToString:@"UILayoutContainerView"]) {
            tempView = subview;
            break;
        }
    }
    if (!tempView) {
        tempView = [window.subviews lastObject];
    }
    
    id nextResponder = [tempView nextResponder];
    while (![nextResponder isKindOfClass:[UIViewController class]] || [nextResponder isKindOfClass:[UINavigationController class]] || [nextResponder isKindOfClass:[UITabBarController class]]) {
        tempView =  [tempView.subviews firstObject];
        
        if (!tempView) {
            return nil;
        }
        nextResponder = [tempView nextResponder];
    }
    return  (UIViewController *)nextResponder;
}

swift写法

class dynamic func getCurrentController() -> UIViewController? {
        
        guard let window = UIApplication.shared.windows.first else {
            return nil
        }
        
        var tempView: UIView?
        
        for subview in window.subviews.reversed() {
            
            
            if subview.classForCoder.description() == "UILayoutContainerView" {
                
                tempView = subview
                
                break
            }
        }
        
        if tempView == nil {
            
            tempView = window.subviews.last
        }
        
        var nextResponder = tempView?.next
        
        var next: Bool {
            return !(nextResponder is UIViewController) || nextResponder is UINavigationController || nextResponder is UITabBarController
        }
        
        while next{
            
            tempView = tempView?.subviews.first
            
            if tempView == nil {
                
                return nil
            }
            
            nextResponder = tempView!.next
        }
        
        return nextResponder as? UIViewController
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 看一下这个好不好
    戀阳阅读 536评论 0 0
  • 行歌途中有一棵早春的树开在理想的三旬,我躲在浓烟下的霓虹深处看你的来信,却不知你只是经过。 初遇,是《理想...
    最喜二陈阅读 3,880评论 0 0
  • 读书一定要认真点,对自己狠一点才可以 文 樱小落 关于读书,很多人都描述过那么多唯美而富有哲理的句子,我觉得我真...
    樱小落阅读 3,795评论 0 1
  • 这篇文章送给父母,我早应该给他们写一些东西了,但是总觉得敲下父母这两个字,有一种莫名的厚重感,这份感觉我无法驾驭,...
    王子豫啊阅读 3,811评论 0 1
  • 梦里水乡, 小桥流水, 鸡鸣走犬, 黑瓦白墙, 绿水青山。 行人缓缓, 视若不见, 我在桥的这一头, 你在桥的那一...
    孤独风阅读 1,733评论 0 2

友情链接更多精彩内容