iOS获取当前显示的controller

流程概述

这篇文章将教你如何在iOS应用中获取当前显示的controller。为了达到这个目标,我们将分为以下几个步骤:

  1. 获取应用的根视图控制器 (Root View Controller)。
  2. 从根视图控制器开始,遍历其子视图控制器,直到找到当前显示的视图控制器。

下面将逐步介绍每个步骤需要做什么,以及每个步骤所需的代码。

步骤一:获取根视图控制器

要获取应用的根视图控制器,可以使用UIApplication的keyWindow属性。UIApplication是iOS应用的主要入口点,keyWindow属性返回应用的主窗口。

下面是获取根视图控制器的代码:

guard let mainWindow = UIApplication.shared.keyWindow else {
    return nil
}
let rootViewController = mainWindow.rootViewController

在这段代码中,我们首先使用UIApplication的shared属性获取到应用的单例实例。然后,我们使用keyWindow属性获取到主窗口对象。最后,我们通过rootViewController属性获取到根视图控制器。在这里,我们使用了可选绑定来确保获取到正确的窗口和视图控制器。

步骤二:遍历子视图控制器

一旦我们获得了根视图控制器,我们就可以开始遍历它的子视图控制器了。这个过程可以通过递归来完成。我们将编写一个递归的函数来遍历所有子视图控制器,直到找到当前显示的控制器。

下面是遍历子视图控制器的代码:

func getCurrentViewController(from viewController: UIViewController) -> UIViewController? {
    if let presentedViewController = viewController.presentedViewController {
        return getCurrentViewController(from: presentedViewController)
    }
    
    if let navigationController = viewController as? UINavigationController {
        return navigationController.visibleViewController
    }
    
    if let tabBarController = viewController as? UITabBarController {
        return tabBarController.selectedViewController
    }
    
    return viewController
}

在这段代码中,我们定义了一个名为getCurrentViewController的递归函数,用于遍历子视图控制器。这个函数接受一个UIViewController参数,并返回一个UIViewController对象。

在函数的实现中,我们首先检查传入的视图控制器是否有presentedViewController,如果有,则递归调用getCurrentViewController函数来处理这个被展示的控制器。这是因为在某些情况下,当前显示的控制器可能是一个被另一个控制器present出来的控制器。

然后,我们检查传入的视图控制器是否是一个UINavigationController的实例,如果是,我们使用visibleViewController属性获取导航控制器当前显示的控制器。

接下来,我们检查传入的视图控制器是否是一个UITabBarController的实例,如果是,我们使用selectedViewController属性获取选中的控制器。

最后,如果以上条件都不满足,我们直接返回传入的视图控制器作为当前显示的控制器。

总结

通过上述步骤,我们可以获取到当前显示的视图控制器。下面是整个流程的总结表格:

步骤 代码
1 swift guard let mainWindow = UIApplication.shared.keyWindow else { return nil } let rootViewController = mainWindow.rootViewController
2 swift func getCurrentViewController(from viewController: UIViewController) -> UIViewController? { if let presentedViewController = viewController.presentedViewController { return getCurrentViewController(from: presentedViewController) } if let navigationController = viewController as? UINavigationController { return navigationController.visibleViewController } if let tabBarController = viewController as? UITabBarController { return tabBarController.selectedViewController } return viewController }

希望这篇文章对你理解如何在iOS应用中获取当前显示的控制器有所帮助。通过这个过程,你将能够更好地理解应用的界面结构,并且可以根据需要执行一些特定的操作。