如何在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() }