我在我的应用程序中添加了一个功能,该功能位于Swift 4中,允许视图在显示图表时定向到横向或纵向。我为每个方向创建了两个单独的视图,并且我已经创建了处理该过程的逻辑。它可以正常工作,除了我可以解决的一个小问题,如果我可以确定调用ViewController。我尝试过使用
self.window?.rootViewController?.presentedViewController
哪个未被证明是准确的。我已经检查了应用程序和窗口的参数而没有任何成功。这是可能做的还是我需要依赖全局变量?
答案 0 :(得分:0)
app delegate返回一个位掩码,指示完整应用程序支持的“最大集合”方向,无论当前呈现的是哪个视图控制器。
此外,还会询问所呈现的具体视图控制器(supportedInterfaceOrientations
)并返回其自己支持的方向。
最后,两个返回值将相交以获得当前支持的方向。
如果我没记错的话,这两个值必须至少在一个方向上达成一致。如果是app delegate说它只支持“portrait(up)”,但视图控制器只支持“landscape left”,你的应用程序会崩溃(或做更糟糕的事情)
答案 1 :(得分:0)
您可以像这样检索应用程序的最顶层viewController:
func topViewController() -> UIViewController {
let controller = UIApplication.shared.keyWindow?.rootViewController
if let presentedVC = controller?.presentedViewController {
return presentedVC
}
return controller!
}
答案 2 :(得分:0)
进入topViewController取决于视图的配置。使用.isKind(of:VC)可帮助您根据可能使用的任何视图层次结构返回适当的ViewController:
private func topViewControllerWithRootViewController(rootViewController: UIViewController!) -> UIViewController? {
if (rootViewController == nil) { return nil }
if (rootViewController.isKind(of: UITabBarController.self)) {
return topViewControllerWithRootViewController(rootViewController: (rootViewController as! UITabBarController).selectedViewController)
} else if (rootViewController.isKind(of: UINavigationController.self)) {
return topViewControllerWithRootViewController(rootViewController: (rootViewController as! UINavigationController).visibleViewController)
} else if (rootViewController.presentedViewController != nil) {
return topViewControllerWithRootViewController(rootViewController: rootViewController.presentedViewController)
}
return rootViewController
}