我正在研究一种方法,可以通过深层链接转到我的应用程序中的特定屏幕,并且需要从场景委托中实现此目的。
目前的继承权如下:
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)
}
我还能做什么来获取对所呈现的视图控制器的引用,而不是标签栏中的视图控制器?
我假设您从
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
}