如何在Swift中的两个场景之间传递数据?

我有两个场景,我想通过一个segue将一个variables传递给另一个场景。 我已经尝试,但不幸的是,我所看到的所有教程都处理故事板。 我不使用故事板。 我正在通过编程来完成这一切。

这是我想要初始化的segue:

func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { if (segue.identifier == "segueTest") { var lose = segue.destinationViewController as! loserScene; lose.toPass = scoreLabelNode.text } } 

失败者场景是我的第二个场景。
scoreLabelNode.text是我用作分数的NSTimer的文本。

我想将scoreLabelNode.text移到另一个场景,这是我的失败者场景。

我的失败者场景是这样设置的:

  import SpriteKit import Foundation let GameOverLabelCategoryName = "gameOverLabel" class loserScene: SKScene { var toPass: String! var scoreLabel = SKLabelNode(fontNamed:"[z] Arista Light") override func didMoveToView(view: SKView) { var gameOver = SKSpriteNode(imageNamed: "gameover.png") gameOver.position = CGPoint(x: self.frame.size.width/2, y: self.frame.size.height/2) self.addChild(gameOver) println(toPass) } } 

我试图打印'toPass'来testingstring赛格,但我只是得到零。

好! 所以,而不是使用赛格。 你不能用SKSCENE做。 我使用了一个结构。 我把结构放在我想要传递数据的场景之外,并确保数据被input到结构中。 然后我从另一个场景访问结构,它完美的工作!

 struct Variables { static var aVariable = 0 } 

这是结构^我已经设置为0,但是当游戏运行结束时logging得分时它会自动更新。 然后我在另一个场景中如此访问它:

 print(Variables.aVariable) 

这将从我的新场景中的结构打印variables。 我也可以把这个结构变成一个string,并将其用于labelnode。

您的toPassstring返回nil,因为您从您的prepareForSegue方法发送值时未初始化该string。

例如创build一个函数。

 // Do whatever you need with the toPass variable. func printToPassValue(){ print(toPass) } 

并将属性观察器添加到toPassvariables。 喜欢这个;

 var toPass: String? { willSet { printToPassValue() // Call your function } } 

并将此函数添加到您的viewDidLoad方法。

 override func viewDidLoad() { super.viewDidLoad() printToPassValue() }