Swift 从SKScene显示UIViewController时显示黑屏

Swift 从SKScene显示UIViewController时显示黑屏,swift,uiviewcontroller,sprite-kit,skscene,Swift,Uiviewcontroller,Sprite Kit,Skscene,这段代码旨在向用户展示UIViewController“菜单”,而是用一个黑屏向用户致意 let currentViewController:UIViewController=UIApplication.shared.keyWindow!.rootViewController! let mymenu = menu() currentViewController.present(mymenu, animated: true, completion: nil) 我正在从一个SKScene过渡到从另

这段代码旨在向用户展示
UIViewController
“菜单”,而是用一个黑屏向用户致意

let currentViewController:UIViewController=UIApplication.shared.keyWindow!.rootViewController!
let mymenu = menu()
currentViewController.present(mymenu, animated: true, completion: nil)

我正在从一个
SKScene
过渡到从另一个
SKScene
呈现一个
SKScene
,例如,您应该执行以下操作:

let nextScene = MainScene(size: self.scene!.size)
self.scene?.view?.presentScene(nextScene, transition: SKTransition.doorway(withDuration: 1))
您不需要检索
currentViewController
,因为您始终可以访问
场景的
视图


正如下面对注释所解释的,有多种方法可以调用实现到游戏viewController的函数,其中一种方法可以是创建代理/协议,如以下代码所示:

游戏场景示例

import SpriteKit
protocol GameViewControllerDelegate: class {
    func callMethod(inputProperty:String)
}
class GameScene: SKScene {
    weak var gameViewControllerDelegate:GameViewControllerDelegate?
    override func didMove(to view: SKView) {
        gameViewControllerDelegate?.callMethod(inputProperty: "call game view controller method")
    }
}
class GameViewController: UIViewController, GameViewControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        if let view = self.view as! SKView? {
            // Load the SKScene from 'GameScene.sks'
            if let scene = SKScene(fileNamed: "GameScene") {
                let gameScene = scene as! GameScene
                gameScene.gameViewControllerDelegate = self
                gameScene.scaleMode = .aspectFill
                view.presentScene(gameScene)
            }
            view.ignoresSiblingOrder = true
            view.showsFPS = true
            view.showsNodeCount = true
        }
    }
    func callMethod(inputProperty:String) {
        print("inputProperty is: ",inputProperty)
    }
}
游戏视图控制器示例

import SpriteKit
protocol GameViewControllerDelegate: class {
    func callMethod(inputProperty:String)
}
class GameScene: SKScene {
    weak var gameViewControllerDelegate:GameViewControllerDelegate?
    override func didMove(to view: SKView) {
        gameViewControllerDelegate?.callMethod(inputProperty: "call game view controller method")
    }
}
class GameViewController: UIViewController, GameViewControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        if let view = self.view as! SKView? {
            // Load the SKScene from 'GameScene.sks'
            if let scene = SKScene(fileNamed: "GameScene") {
                let gameScene = scene as! GameScene
                gameScene.gameViewControllerDelegate = self
                gameScene.scaleMode = .aspectFill
                view.presentScene(gameScene)
            }
            view.ignoresSiblingOrder = true
            view.showsFPS = true
            view.showsNodeCount = true
        }
    }
    func callMethod(inputProperty:String) {
        print("inputProperty is: ",inputProperty)
    }
}
输出

import SpriteKit
protocol GameViewControllerDelegate: class {
    func callMethod(inputProperty:String)
}
class GameScene: SKScene {
    weak var gameViewControllerDelegate:GameViewControllerDelegate?
    override func didMove(to view: SKView) {
        gameViewControllerDelegate?.callMethod(inputProperty: "call game view controller method")
    }
}
class GameViewController: UIViewController, GameViewControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        if let view = self.view as! SKView? {
            // Load the SKScene from 'GameScene.sks'
            if let scene = SKScene(fileNamed: "GameScene") {
                let gameScene = scene as! GameScene
                gameScene.gameViewControllerDelegate = self
                gameScene.scaleMode = .aspectFill
                view.presentScene(gameScene)
            }
            view.ignoresSiblingOrder = true
            view.showsFPS = true
            view.showsNodeCount = true
        }
    }
    func callMethod(inputProperty:String) {
        print("inputProperty is: ",inputProperty)
    }
}

但我正在转换为视图,而不是SKScene。您应该区分
UIKit
元素和
Sprite kit
元素,特别是在游戏中使用时。您也没有视图,但有一个包含
SKScene
SKView
,因此无法“转换”到视图对不起,我不明白。我想在我的SKScene中调用一个函数,它将为播放器提供uiviewcontroller。啊,对了,这是另一个故事:-),无论如何,你可以在你的场景中提供播放器视图或任何其他
UIKit
视图
self.scene?.view?.addSubview()
好的,抱歉,谢谢,但是我如何为播放器提供uiviewcontroller?