Ios Swift:更改ViewController时:前一个不会';不要拒绝

Ios Swift:更改ViewController时:前一个不会';不要拒绝,ios,swift,uiviewcontroller,sprite-kit,uikit,Ios,Swift,Uiviewcontroller,Sprite Kit,Uikit,说到UIKit和ViewController,我是个傻瓜。我正在尝试从SplashScreenViewController切换到GameViewController,这是一个SKView。GameViewController加载正常,因为我可以听到游戏音乐开始,但是SplashScreenController从未从屏幕上消失。所以基本上我有SplashScreenController停留在屏幕上,我可以听到GameViewController在后台启动。我做错了什么 这是ScreenView控制

说到UIKit和ViewController,我是个傻瓜。我正在尝试从
SplashScreenViewController
切换到
GameViewController
,这是一个SKView。GameViewController加载正常,因为我可以听到游戏音乐开始,但是
SplashScreenController
从未从屏幕上消失。所以基本上我有
SplashScreenController
停留在屏幕上,我可以听到
GameViewController
在后台启动。我做错了什么

这是ScreenView控制器的代码:

class SplashScreenViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.backgroundColor = UIColor(red:  46/255, green: 83/255, blue: 160/255, alpha: 1.0)
        let image : UIImage = UIImage(named:"splashScreen.png")!
        let bgImage = UIImageView(image: image)

        bgImage.frame = CGRect(origin: CGPoint(x: 3,y: -3), size: CGSize(width: self.view.frame.size.width, height: self.view.frame.size.height))
        self.view.addSubview(bgImage)

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let controller = storyboard.instantiateViewController(withIdentifier: "GameViewController")
        self.present(controller, animated: true, completion: nil)
        self.dismiss(animated: true, completion: nil)
    }

    deinit {
        print("Object with name SplashScreenViewController is being released")
    }
}

据我所知,您想用您的
GameViewController
替换
SplashScreenViewController
。您当前的代码正在以模式和直接方式显示
GameViewController
,然后将其取消。因此,不会显示新的视图控制器

代码中的另一个问题是缺少计时间隔,当前启动屏幕已初始化,之后如果代码正常工作,它将被
GameViewController
替换,因此您将只看到
GameViewController

class SplashScreenViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.backgroundColor = UIColor(red:  46/255, green: 83/255, blue: 160/255, alpha: 1.0)
        let image : UIImage = UIImage(named:"splashScreen.png")!
        let bgImage = UIImageView(image: image)

        bgImage.frame = CGRect(origin: CGPoint(x: 3,y: -3), size: CGSize(width: self.view.frame.size.width, height: self.view.frame.size.height))
        self.view.addSubview(bgImage)

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let controller = storyboard.instantiateViewController(withIdentifier: "GameViewController")            

        // Here we create a dispatch queue to do some other code after an amount of time. In this case, one second.
        let dispatchTime = DispatchTime.now() + .seconds(1)
        DispatchQueue.main.asyncAfter(deadline: dispatchTime) {
           self.navigationController?.setViewControllers([controller!], animated: false)
        }
    }
}
此设置将在1秒后用GameViewController替换SplashScreenViewController。要使其正常工作,以及基本上所有视图控制器之间的导航,必须将第一个视图控制器包装到
UINavigationController

您可以将窗口设置为用游戏屏幕替换初始屏幕。 代码如下所示

let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window!.rootViewController = gameViewController

这很简单,请在dismissViewController方法完成时向nextviewcontroller演示。这是一个有趣的想法,但我想只有在
SplashScreenViewController
被解除后,如果剩下一个视图控制器,它才会起作用。