如何在AppDelegate中显示当前显示的UIViewController?

Pan*_*ngu 6 uiviewcontroller ios swift swift3

我正在尝试获取当前UIViewController不在AppDelegate中的显示,但它似乎总是得到最初的顶部UIViewController,而不是现在的顶部.

AppDelegate中的以下代码获取当前UIViewController存在的代码,但是当我在任何一个View控制器中使用它时,同样的功能不起作用:

func getTopViewController() -> UIViewController
{
    var topViewController = UIApplication.sharedApplication().delegate!.window!!.rootViewController!
    while (topViewController.presentedViewController != nil) {
        topViewController = topViewController.presentedViewController!
    }
    return topViewController
}
Run Code Online (Sandbox Code Playgroud)

上面的代码是作为类似问题的答案提供的: 在AppDelegate.m的屏幕上获取当前显示的UIViewController

无论我有多么深刻,我都只能检索出最前面的View Controller.

我怎样才能获得当前的演示UIViewController

仅供参考:我不是在使用UINavigationController常规UIViewController课程.

Mar*_*vic 18

我不喜欢使用它,但有时它是必要的.

static func getTopViewController() -> UIViewController {

    var viewController = UIViewController()

    if let vc =  UIApplication.shared.delegate?.window??.rootViewController {

        viewController = vc
        var presented = vc

        while let top = presented.presentedViewController {
            presented = top
            viewController = top
        }
    }

    return viewController
}
Run Code Online (Sandbox Code Playgroud)

**编辑:

这是一个改进版本,它将始终获得最顶级的视图控制器

static var top: UIViewController? {
    get {
        return topViewController()
    }
}

static var root: UIViewController? {
    get {
        return UIApplication.shared.delegate?.window??.rootViewController
    }
}

static func topViewController(from viewController: UIViewController? = UIViewController.root) -> UIViewController? {
    if let tabBarViewController = viewController as? UITabBarController {
        return topViewController(from: tabBarViewController.selectedViewController)
    } else if let navigationController = viewController as? UINavigationController {
        return topViewController(from: navigationController.visibleViewController)
    } else if let presentedViewController = viewController?.presentedViewController {
        return topViewController(from: presentedViewController)
    } else {
        return viewController
    }
}
Run Code Online (Sandbox Code Playgroud)