遊戲中的多個 UIViewController 如何從場景跳轉到 viewController

故事板

StackOverflow 文件

初始 viewController :一個空的 viewController,帶有一個顯示 GameViewController 的按鈕

GameViewControllerHello World Sprite-kit 模板的典型 GameViewController。

目標 :我想從我的 SKScene 遊戲中展示第一個 viewController 並正確釋放我的場景。

描述 :為了獲得結果,我擴充套件了 SKSceneDelegate 類以構建一個自定義 protocol/delegate,它從 GameViewController 轉換到第一個初始控制器(主選單)。此方法可以擴充套件到遊戲的其他 viewControllers。

GameViewController

import UIKit
import SpriteKit
class GameViewController: UIViewController,TransitionDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        if let view = self.view as! SKView? {
            if let scene = SKScene(fileNamed: "GameScene") {
                scene.scaleMode = .aspectFill
                scene.delegate = self as TransitionDelegate
                view.presentScene(scene)
            }
            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)
        }
    }
}

GameScene

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 }
            self.view?.presentScene(nil)
            (delegate as! TransitionDelegate).returnToMainMenu()
        })
    }
    deinit {
        print("\n THE SCENE \((type(of: self))) WAS REMOVED FROM MEMORY (DEINIT) \n")
    }
}