2015-07-02 72 views
1

我一直在試圖弄清楚如何在SKScene中呈現一個UIViewController。如何在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 
       } 
      } 
     } 
    } 
+0

可能的重複[如何從SKScene提供UIViewController?](http://stackoverflow.com/questions/19438719/how-do-i-present-a-uiviewcontroller-from-skscene) – JAL

回答

0

做到這一點的方法是創建類的聲明之上的協議來創建委託,這樣就可以從GameViewController.swift

開始呈現視圖控制器

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

現在,向GameScene添加一個屬性來保存這個

var gameDelegate: GameDelegate? 

最後,從touchesBegan方法中調用你的方法。

gameDelegate?.launchViewController(scene: self) 

它在iOS的習慣通過自我來發揮作用的說法,這樣,如果你有一個以上的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 

這種方式,委託允許從另一個視圖控制器呈現視圖控制器

0

下面是我如何解決它,因爲沒有在stackoverflow中的答案爲我工作哈哈d把所有的碎片從不同的碎片中拼湊出來。

首先設置GameScene.swift倒是開始

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中的視圖。

相關問題