美文网首页利器集合iOS高阶UI相关程序员
iOS:关于获取当前控制器的方法

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

作者: 斯文_7 | 来源:发表于2016-05-12 16:30 被阅读6485次

在做项目时,有时候,会写一个工具类来对项目进行操作:
这个时候如果需要使用当前控制器去进行一些操作,比如想去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
    }
}

相关文章

网友评论

  • Teun丶:请问swift版的是最终版本么,有点问题,拿到的控制器不对哦
    斯文_7:@Tynn丶 嗯嗯,我这边会检查一下,给你回复
    Teun丶:@斯文_7 是的,我的结构是tabbarVC -> Nav ->UIViewVC ->Push->UIViewVC_01 ,当进入UIViewVC_01之后,获取的当前控制器是nav,而不是UIViewVC_01,当前应该是UIViewVC_01才对的吧
    斯文_7:@Tynn丶 不对么,已经是优化过的
  • 李某lkb:如果有多个window呢.拿到的东西不对.
  • 聪明的笨白:这方法是错误的,拿到的不是当前控制器
    斯文_7:已经优化,谢谢提醒
  • manajay:关键是 我用了没有效果
    斯文_7:已经优化
  • 酷酷的哀殿:很抱歉,这篇文章不能审核通过。这种写法很容易导致闪退,建议您优化一下再投稿。
    斯文_7:@酷酷的哀殿 o

本文标题:iOS:关于获取当前控制器的方法

本文链接:https://www.haomeiwen.com/subject/axdprttx.html