一尘不染

尝试呈现ViewController,其视图不在Windows层次结构中

swift

我遇到一个奇怪的问题:我制作了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视图。


阅读 173

收藏
2020-07-07

共1个答案

一尘不染

问题

当前的viewController不是rootViewControllerfrom
UIApplication。因此,您应该找到当前可见的viewController,然后从那里显示它。

只需在上找到topViewController 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

2020-07-07