我遇到一个奇怪的问题:我制作了2个视图控制器,可以用代码切换视图:
var currentViewController:UIViewController=UIApplication.shared.keyWindow!.rootViewController! func showController() { let ViewControllernew1 = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "viewController2") currentViewController.present(ViewControllernew1, animated: true, completion: nil) }
我的应用程序正确地向第一个视图控制器打开,然后,当我单击在Sprite Kit场景上创建的按钮时,我可以成功地将视图切换到新的视图控制器(我成功显示了第二个场景),但是,我可以切换后不再更改我的视图控制器。如果再次单击该按钮,则会收到以下消息:
尝试在Test_Vuforia.GameViewController上显示:0x12f549610,其视图不在窗口层次结构中!
你知道是什么问题吗?我知道我处于根位置,因此切换后无法再更改其视图控制器,但是如何更改呢?
谢谢 !
编辑:
我的代码在SKScene内部使用,而不是从UIVewController使用,使用后缀self时出现此错误。:类型为View(SKScene)的值没有成员’present’。
我正在用Vuforia创建增强现实游戏,我需要使用SKScene切换AR视图。
当前的viewController不是rootViewControllerfrom UIApplication。因此,您应该找到当前可见的viewController,然后从那里显示它。
rootViewController
UIApplication
只需在上找到topViewController UIApplication Stack,然后从那里显示您的控制器。
UIApplication Stack
let newViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "viewController2") UIApplication.topViewController()?.present(newViewController, animated: true, completion: nil)
的扩展名可UIApplication为您提供方便
extension UIApplication { class func topViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? { if let nav = base as? UINavigationController { return topViewController(base: nav.visibleViewController) } if let tab = base as? UITabBarController { if let selected = tab.selectedViewController { return topViewController(base: selected) } } if let presented = base?.presentedViewController { return topViewController(base: presented) } return base } }
参考:Gist