如何在Swift中的两个场景之间传递数据?
How do I pass data between two scenes in Swift?
我有两个场景,我想使用 segue 将单个变量传递给另一个场景。我已经尝试过,但不幸的是,我看到的所有教程都在处理情节提要。我没有使用故事板。我正在以编程方式完成所有这些工作。
这是我要初始化的转场:
func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
if (segue.identifier == "segueTest") {
var lose = segue.destinationViewController as! loserScene;
lose.toPass = scoreLabelNode.text
}
}
The Loser Scene 是我的第二个场景。
scoreLabelNode.text 是我用作分数的 NSTimer 的文本。
我想将 scoreLabelNode.text 移动到另一个场景,即我的 loserScene。
我的 loserScene 是这样设置的:
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' 来测试字符串转场,但我只得到 nil。
你的 toPass String returns nil 因为当你从你的 prepareForSegue 方法发送值时它没有被初始化。
例如创建一些函数;
// Do whatever you need with the toPass variable.
func printToPassValue(){
print(toPass)
}
并将 属性 观察者添加到您的 toPass 变量中。像这样;
var toPass: String? {
willSet {
printToPassValue() // Call your function
}
}
并将此函数添加到您的 viewDidLoad 方法中。
override func viewDidLoad() {
super.viewDidLoad()
printToPassValue()
}
好的!所以不要使用 segue。使用 SKSCENE 无法做到这些。我用了一个结构。我将结构放在我希望从中传递数据的场景之一之外,并确保数据被馈送到结构中。然后我从另一个场景访问了该结构,它工作得很好!
struct Variables {
static var aVariable = 0
}
这是结构^我将它设置为 0,但当我的游戏 运行 结束时记录分数时它会自动更新。
然后我在另一个场景中像这样访问它:
print(Variables.aVariable)
这会在我的新场景中打印结构中的变量。我还可以将此结构转换为字符串并将其用于标签节点。
我有两个场景,我想使用 segue 将单个变量传递给另一个场景。我已经尝试过,但不幸的是,我看到的所有教程都在处理情节提要。我没有使用故事板。我正在以编程方式完成所有这些工作。
这是我要初始化的转场:
func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
if (segue.identifier == "segueTest") {
var lose = segue.destinationViewController as! loserScene;
lose.toPass = scoreLabelNode.text
}
}
The Loser Scene 是我的第二个场景。
scoreLabelNode.text 是我用作分数的 NSTimer 的文本。
我想将 scoreLabelNode.text 移动到另一个场景,即我的 loserScene。
我的 loserScene 是这样设置的:
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' 来测试字符串转场,但我只得到 nil。
你的 toPass String returns nil 因为当你从你的 prepareForSegue 方法发送值时它没有被初始化。
例如创建一些函数;
// Do whatever you need with the toPass variable.
func printToPassValue(){
print(toPass)
}
并将 属性 观察者添加到您的 toPass 变量中。像这样;
var toPass: String? {
willSet {
printToPassValue() // Call your function
}
}
并将此函数添加到您的 viewDidLoad 方法中。
override func viewDidLoad() {
super.viewDidLoad()
printToPassValue()
}
好的!所以不要使用 segue。使用 SKSCENE 无法做到这些。我用了一个结构。我将结构放在我希望从中传递数据的场景之一之外,并确保数据被馈送到结构中。然后我从另一个场景访问了该结构,它工作得很好!
struct Variables {
static var aVariable = 0
}
这是结构^我将它设置为 0,但当我的游戏 运行 结束时记录分数时它会自动更新。 然后我在另一个场景中像这样访问它:
print(Variables.aVariable)
这会在我的新场景中打印结构中的变量。我还可以将此结构转换为字符串并将其用于标签节点。