获取当前页面的最层控制器 (Swift 4)

本文介绍两种在iOS中获取当前显示视图控制器的方法。第一种适用于UITabBarController结合UINavigationController的布局;第二种则通用所有场景。通过递归查找,无论当前控制器是否被导航控制器包裹或作为标签栏控制器的选择项,都能准确找到。

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

 

第一种模式--->符合 UITabBarController ---> UINavigationController布局

//MARK: 获取当前页面的最顶层控制器 <此方法在ios13 later 会出问题,废弃>

func getCurrentVCBS() -> UIViewController {
    let keywindow = (UIApplication.shared.delegate as! AppDelegate).window//UIApplication.shared.keyWindow使用此有时会崩溃
    let firstView: UIView = (keywindow?.subviews.first)!
    let secondView: UIView = firstView.subviews.first!
    var vc = viewForController(view: secondView)!
    vc = ((vc as! UITabBarController).selectedViewController! as! UINavigationController).visibleViewController!
  
    return vc
}

private func viewForController(view:UIView)->UIViewController?{
    var next:UIView? = view
    repeat{
        if let nextResponder = next?.next, nextResponder is UIViewController {
            return (nextResponder as! UIViewController)
        }
        next = next?.superview
    }while next != nil
    return nil
}

//MARK: 校验结果的正确性

//classType: 当前页面类类型
func vcResult(classType: UIViewController.Type) -> Bool {
    return getCurrentVCBS().isKind(of: classType)
}

 

第二种模式--->所有

///获取当前显示的控制器 UIWindow (Visible)
func getCurrentVCBS2() -> UIViewController {
    let keywindow = (UIApplication.shared.delegate as! AppDelegate).window?.rootViewController//UIApplication.shared.keyWindow
    let rootVC = keywindow!//UIApplication.shared.keyWindow!.rootViewController!
    return getVisibleViewControllerFrom(vc: rootVC)
}

//方法1
func getVisibleViewControllerFrom(vc: UIViewController) -> UIViewController {
    
    if vc.isKind(of: UINavigationController.self) {
        return getVisibleViewControllerFrom(vc: (vc as! UINavigationController).visibleViewController!)
    } else if vc.isKind(of: UITabBarController.self) {
        return getVisibleViewControllerFrom(vc: (vc as! UITabBarController).selectedViewController!)
    } else {
        if (vc.presentedViewController != nil) {
            return getVisibleViewControllerFrom(vc: vc.presentedViewController!)
        } else {
            return vc
        }
    }
    
}

//方法2
func topViewControllerWithRootViewController(rootVC: UIViewController) -> UIViewController {
    
    if rootVC.isKind(of: UITabBarController.self) {
        let tabVC = rootVC as! UITabBarController
        return topViewControllerWithRootViewController(rootVC: tabVC.selectedViewController!)
    } else if rootVC.isKind(of: UINavigationController.self) {
        let navc = rootVC as! UINavigationController
        return topViewControllerWithRootViewController(rootVC: navc.visibleViewController!)
    } else if (rootVC.presentedViewController != nil) {
        return topViewControllerWithRootViewController(rootVC: rootVC.presentedViewController!)
    } else {
        return rootVC
    }
    
}

///验证
func vcResult2(classType: UIViewController.Type) -> Bool {
    return getCurrentVCBS2().isKind(of: classType)
}

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值