【问题标题】:How to get the current displaying UIViewController not in AppDelegate?如何获取当前显示的 UIViewController 不在 AppDelegate 中?
【发布时间】:2017-04-25 17:29:34
【问题描述】:

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

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

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

无论我继续深入,我只能检索到第一个视图控制器。

如何获取当前演示文稿UIViewController

仅供参考:我使用UINavigationController,只是普通的UIViewController 课程。

【问题讨论】:

  • 你在使用导航控制器吗?
  • @Lefteris: 更新...谢谢

标签: ios swift uiviewcontroller swift3


【解决方案1】:

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

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
}

**编辑:

这是一个改进的版本,它总是会得到最顶层的视图控制器

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

【讨论】:

  • 这不起作用,我把它放在 VC2 中,但它仍然抓住了最顶层的 VC,即 VC1,即使我从 VC1->VC2
  • 您是否尝试使用 debug 和 "po" 来查看如何获得 VC2?
  • 在 xcode 中进入调试模式,在 xcode 终端中有 po ( print object) 命令。您可以打印您当前的 vc 并了解如何到达顶部。
  • 这是如何使用 po stackoverflow.com/a/11513877/5324438的示例
  • 我知道这已经过去了 4 个月,但你能解释一下你的代码是做什么的吗?它对我来说很完美。但我只是想了解它是如何实现的。
【解决方案2】:

这是一个函数中的相同想法:

func topController(_ parent:UIViewController? = nil) -> UIViewController {
    if let vc = parent {
        if let tab = vc as? UITabBarController, let selected = tab.selectedViewController {
            return topController(selected)
        } else if let nav = vc as? UINavigationController, let top = nav.topViewController {
            return topController(top)
        } else if let presented = vc.presentedViewController {
            return topController(presented)
        } else {
            return vc
        }
    } else {
        return topController(UIApplication.shared.keyWindow!.rootViewController!)
    }
}

在 Swift 4 项目中为我工作

【讨论】:

    猜你喜欢
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 2012-10-19
    • 2012-03-06
    相关资源
    最近更新 更多