Swift--getCurrentVC拿到当前控制器

很多应用场景会用到,话不多说…

func getCurrentVC1() -> UIViewController? {
    var result: UIViewController? = nil
    if let window = UIApplication.shared.keyWindow{
        var keyWindow = window
     
     // UIWindow.Level window三种等级 normal,alert,statusBar,可见normal才是我们真正要用到的,这段代码就是
        排除其他两种level,找到所需的normalWindow
        if window.windowLevel != UIWindow.Level.normal{
            let windows = UIApplication.shared.windows
            for tmp in windows{
                if tmp.windowLevel == UIWindow.Level.normal{
                    keyWindow = tmp
                    break
                }
            }
        }
        
        func getCurrentVC1(root:UIViewController?) -> UIViewController?{
            var currentVC:UIViewController? = nil
            var rootVC = root
            
            while rootVC?.presentationController != nil {
                rootVC = rootVC?.presentedViewController
            }
            
            if let vc = rootVC as? UITabBarController{
                //UITabBarController.selectedViewController就是rootVC,而不是那个UITabBarController本身
                currentVC = getCurrentVC1(root: vc.selectedViewController)
            }else if let vc = rootVC as? UINavigationController{
                //UINavigationController.visibleViewController才是rootVC,而不是UINavigationController本身
                currentVC = getCurrentVC1(root: vc.visibleViewController)
            }else{
                //除过上面两种VC,比如UIViewController本身就是rootVC
                currentVC = rootVC
            }
            
            return currentVC
        }
        
        result = getCurrentVC1(root: keyWindow.rootViewController)
    }
    
    return result
}




//实际项目中调用
if let myVC = getCurrentVC1() as? myVC {
.......
}

看似简单,完全明白还需要自己动手亲自写一写,体会这里面的思维逻辑,感受这样的设计理念,由小到大你也就会慢慢成长!

猜你喜欢

转载自blog.csdn.net/SoftwareDoger/article/details/100008261