sprite-kit UIKit elements with SpriteKit Multiple UIViewController in a game: how to jump from the scene to a viewController



enter image description here

Initial viewController: an empty viewController with a button to present the GameViewController

GameViewController: the typical GameViewController of the "Hello World" Sprite-kit template.

Goal: I want to present the first viewController from my SKScene game with the correct deallocation of my scene.

Description: To obtain the result I've extended the SKSceneDelegate class to build a custom protocol/delegate that make the transition from the GameViewController to the first initial controller (main menu). This method could be extended to other viewControllers of your game.


import UIKit
import SpriteKit
class GameViewController: UIViewController,TransitionDelegate {
    override func viewDidLoad() {
        if let view = self.view as! SKView? {
            if let scene = SKScene(fileNamed: "GameScene") {
                scene.scaleMode = .aspectFill
                scene.delegate = self as TransitionDelegate
            view.ignoresSiblingOrder = true
            view.showsFPS = true
            view.showsNodeCount = true
    func returnToMainMenu(){
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        guard  let storyboard = appDelegate.window?.rootViewController?.storyboard else { return }
        if let vc = storyboard.instantiateInitialViewController() {
            print("go to main menu")
            self.present(vc, animated: true, completion: nil)


import SpriteKit
protocol TransitionDelegate: SKSceneDelegate {
    func returnToMainMenu()
class GameScene: SKScene {
    override func didMove(to view: SKView) {
        self.run(SKAction.wait(forDuration: 2),completion:{[unowned self] in
            guard let delegate = self.delegate else { return }
            (delegate as! TransitionDelegate).returnToMainMenu()
    deinit {
        print("\n THE SCENE \((type(of: self))) WAS REMOVED FROM MEMORY (DEINIT) \n")