【问题标题】:Presenting a UIViewController from SKScene shows black screen从 SKScene 呈现 UIViewController 显示黑屏
【发布时间】:2017-01-27 09:31:39
【问题描述】:

此代码旨在向用户显示UIViewController“菜单”,而是以黑屏迎接他们。

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

我正在从 SKScene 转换。

【问题讨论】:

    标签: swift uiviewcontroller sprite-kit skscene


    【解决方案1】:

    要从另一个SKScene 呈现SKScene,您应该这样做:

    let nextScene = MainScene(size: self.scene!.size)
    self.scene?.view?.presentScene(nextScene, transition: SKTransition.doorway(withDuration: 1))
    

    您无需检索您的currentViewController,因为您始终可以访问您的sceneview


    正如下面的 cmets 所解释的,有多种方法可以调用实现到游戏 viewController 的函数,其中一种可能是创建一个 delegate/protocol,如下代码所示:

    GameScene 示例

    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")
        }
    }
    

    GameViewController 示例

    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 元素,尤其是在您使用游戏时。您也没有视图,但有一个包含 SKSceneSKView,因此您无法“转换”到视图
    • 对不起,我不明白。我想在我的 SKScene 中调用一个函数,它会向玩家展示一个 uiviewcontroller。
    • 啊,对了,那是另一个故事 :-) ,无论如何你可以在你的场景中展示玩家视图或任何其他UIKit 视图self.scene?.view?.addSubview(<your UIKit element>)
    • 好的,抱歉,谢谢,但是如何向玩家展示 uiviewcontroller?
    猜你喜欢
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    相关资源
    最近更新 更多