参考当前呈现的视图控制器

问题描述 投票:0回答:1

我正在研究一种方法,可以通过深层链接转到我的应用程序中的特定屏幕,并且需要从场景委托中实现此目的。

目前的继承权如下:

UITabViewController

选项卡 1 中的 UIViewController

UIViewController 在所有内容之上呈现模态全屏(不在导航控制器中)。

我想参考当前呈现的模式,这样我就可以以编程方式从中采取行动。 这就是我的问题所在。 我似乎无法参考模态。 我能找到的最深入的参考是选项卡 1 上的视图控制器。

我试过了

func getTopViewController()->UIViewController{
    return topViewControllerWithRootViewController(UIApplication.sharedApplication().keyWindow!.rootViewController!)
}
func topViewControllerWithRootViewController(rootViewController:UIViewController)->UIViewController{
    if rootViewController is UITabBarController{
        let tabBarController = rootViewController as! UITabBarController
        return topViewControllerWithRootViewController(tabBarController.selectedViewController!)
    }
    if rootViewController is UINavigationController{
        let navBarController = rootViewController as! UINavigationController
        return topViewControllerWithRootViewController(navBarController.visibleViewController)
    }
    if let presentedViewController = rootViewController.presentedViewController {
        return topViewControllerWithRootViewController(presentedViewController)
    }
    return rootViewController
} 

以下打印出 nil

if let tabBarController = window?.rootViewController as? UITabBarController,
           let dashboardViewController = tabBarController.selectedViewController as? AccountDashboardViewController{
            print("presented controller", dashboardViewController.presentedViewController)
}

我还能做什么来获取对所呈现的视图控制器的引用,而不是标签栏中的视图控制器?

ios swift uikit
1个回答
0
投票

我假设您从

UITabBarController
呈现模态,因此您无法获取对模态的引用,因为由于第一个 if 语句,您的函数从
UITabBarController
->
AccountDashboardViewController
(selectedViewController) 运行。
AccountDashboardViewController
不会显示您的模态,因此您只需返回它即可。要解决这个问题,只要先放入if语句获取
rootViewController.presentedViewController
,然后就可以得到你想要的了:

func topViewControllerWithRootViewController(rootViewController:UIViewController)-> UIViewController {
    if let presentedViewController = rootViewController.presentedViewController {
        return topViewControllerWithRootViewController(presentedViewController)
    }
    if rootViewController is UITabBarController{
        let tabBarController = rootViewController as! UITabBarController
        return topViewControllerWithRootViewController(tabBarController.selectedViewController!)
    }
    if rootViewController is UINavigationController{
        let navBarController = rootViewController as! UINavigationController
        return topViewControllerWithRootViewController(navBarController.visibleViewController)
    }
    return rootViewController
}
© www.soinside.com 2019 - 2024. All rights reserved.