首先声明如果项目有多个Scene的时候,需要对Scene进行一定的配置控制和判断才能更准确的找到适合的控制器,下面的工具逻辑是:找到活跃的WindowScene,找到根控制器,如果有导航控制器,则优先返回,如果有标签控制器,也优先返回。整体可能找不到合适的控制器,返回空。
// 获取当前控制器
extension UIViewController {
class func current(_ base: UIViewController?=nil) -> UIViewController? {
var target = base
if target == nil {
if #available(iOS 13.0, *) {
for windowScene: UIWindowScene in (UIApplication.shared.connectedScenes as? Set<UIWindowScene>)! {
if windowScene.activationState == .foregroundActive {
for window in windowScene.windows {
let root = window.rootViewController
if root.self?.isKind(of: UINavigationController.self) ?? false { target = root }
}
if target == nil { targe