【问题标题】:How to present a UIViewController in a SKScene?如何在 SKScene 中呈现 UIViewController?
【发布时间】:2015-07-02 15:18:02
【问题描述】:

我一直在试图弄清楚如何在 SKScene 中呈现 UIViewController。

更具体地说,我正在处理 GameScene.swift,当按下图像时,我想展示 uiviewcontroller。

import SpriteKit

class GameScene: SKScene {



    override func didMoveToView(view: SKView) {
        /* Setup your scene here */


        backgroundColor = SKColor.blackColor()
        var timeBetweenDots = NSTimer.scheduledTimerWithTimeInterval(0.35, target: self, selector: Selector("spawnWhiteDots"), userInfo: nil, repeats: true)
    }



    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */

    }




    func spawnWhiteDots(){

    var dotWhite = SKSpriteNode(imageNamed: "whiteDot.png")

    dotWhite.name = "destroyWhiteDot"

    var randomDotPlacement = arc4random() % 9
    switch (randomDotPlacement){
    case 1:
        dotWhite.position = CGPointMake(self.size.width / 2.92, self.size.height / 1)
        break
    case 2:
        dotWhite.position = CGPointMake(self.size.width / 1.81, self.size.height / 1)
        break
    case 3:
        dotWhite.position = CGPointMake(self.size.width / 2.24, self.size.height / 1)
        break
    case 4:
        dotWhite.position = CGPointMake(self.size.width / 1.52, self.size.height / 1)
        break
    case 5:
        dotWhite.position = CGPointMake(self.size.width / 2.92, self.size.height / 1)
        break
    case 6:
        dotWhite.position = CGPointMake(self.size.width / 2.24, self.size.height / 1)
        break
    case 7:
        dotWhite.position = CGPointMake(self.size.width / 1.52, self.size.height / 1)
        break
    case 8:
        dotWhite.position = CGPointMake(self.size.width / 1.81, self.size.height / 1)
        break
    default:
        break
    }

    let fallAction = SKAction.moveToY(-50, duration: 3.0)

    dotWhite.runAction(SKAction.repeatActionForever(fallAction))

    addChild(dotWhite)

    }


    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        /* Called when a touch begins */
        for touch: AnyObject in touches {
            let location = (touch as UITouch).locationInNode(self)
            if let gameOverDot = self.nodeAtPoint(location).name {
                if gameOverDot == "destroyWhiteDot"{
                    self.removeChildrenInArray([self.nodeAtPoint(location)])
                    ///when the image is pressed I want to present the UIViewController here the name of the viewController is gameOverScene
                }
            }
        }
    }

【问题讨论】:

标签: ios swift cocoa-touch uiviewcontroller sprite-kit


【解决方案1】:

这样做的方法是创建一个 delegate 以便您可以从 GameViewController.swift 呈现视图控制器

首先在类声明之上创建一个协议

protocol GameDelegate {
    func launchViewController(#scene: SKScene)
} 

现在,向 GameScene 添加一个属性来保存它

var gameDelegate: GameDelegate?

最后,从 touchesBegan 方法中调用您的方法。

gameDelegate?.launchViewController(scene: self)

iOS 习惯将 self 作为参数传递给函数,这样,如果您有多个 GameScene,您可以将它们区分开来。

现在,在 GameViewController 中,添加协议实现

class GameViewController: UIViewController, GameSceneDelegate {

    func launchViewController(scene: SKScene) {
        let vc = // create view controller by storyboard or by custom initialization
        presentViewController(vc, animated: true, completion: nil)
    }

    // ... OTHER STUFF ...
}

最后但同样重要的是,在skView.presentScene(scene)之前添加以下代码行

scene.gameDelegate = self

通过这种方式,委托允许您从另一个视图控制器呈现视图控制器

【讨论】:

    【解决方案2】:

    这就是我解决它的方法,因为 stackoverflow 中没有一个答案对我有用,我不得不将所有不同的部分放在一起。

    首先设置GameScene.swift Touches Begin

    NSNotificationCenter.defaultCenter().postNotificationName("showController", object: nil, userInfo: nil)
    

    比在 GameViewController viewDidLoad()中

        NSNotificationCenter.defaultCenter().addObserver(self, selector: "presentView", name: "showController", object: nil)
    

    创建你的函数

    func presentView() {
    self.performSegueWithIdentifier("toMyController", sender: self)
    }
    

    我的转场是模态转场。

    PS:请记住,gameScene 是 GameViewController 中的一个视图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      相关资源
      最近更新 更多