ios - 如何获取当前显示的 UIViewController 不在 AppDelegate 中?

标签 ios swift uiviewcontroller swift3

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

AppDelegate 中的以下代码确实获得了当前的 UIViewController,但是当我在我的任何一个 View Controller 中使用它时,这个相同的功能不起作用:

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

以上代码是作为类似问题的答案提供的: Get the current displaying UIViewController on the screen in AppDelegate.m

无论我深入到多深,我只能检索到最前面的 View Controller 。

如何获取当前呈现的 UIViewController

仅供引用:我使用UINavigationController,只是常规的UIViewController类。

最佳答案

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

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
}

**编辑:

这是一个改进的版本,它总是获取最顶层的 View Controller

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

关于ios - 如何获取当前显示的 UIViewController 不在 AppDelegate 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41073915/

相关文章:

ios - 纠正当前 UIInterfaceOrientation 的 CMMotionManager 偏航

iphone - 将自定义 UI 对象 (UISwitch) 添加到 iOS 项目

ios - UIPageControl 选择点并转到该页面

swift - 弹出 ViewController 后如何检查堆栈顶部的 ViewController 是否是特定的?

ios - 在传递 prepareForSegue 时,如何将我的模型对象传递给我的 VC?

ios - 如何将 UITableView 添加到现有 View

ios - 如何在 Xcode 6 iOS 应用程序中实现 main.swift?

iphone - 在 objective-c 中解析文本文件

ios - Swift - 检测不同父 View 的 subview 是否相交

ios - 在 Swift Sprite Kit 中拖放类型的东西?