Swift--getCurrentVC拿到当前控制器

在多种应用场景中,获取当前控制器是常见的需求。通过理解并实现这一功能,可以深入理解Swift的思维逻辑和设计理念,从而促进个人技能的提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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 {
.......
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值