How do I pass data between two scenes in Swift?

家住魔仙堡 提交于 2019-12-20 03:26:18

问题


I have two scenes where I would like to pass a single variable to another scene using a segue. I have tried but unfortunately all tutorials I have seen are dealing with the storyboard. I am not using the storyboard. I am doing all of this programatically.

Here is the segue i am trying to initialize:

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

        lose.toPass = scoreLabelNode.text

    }
}

The Loser Scene is my second scene.
scoreLabelNode.text is the text of an NSTimer which i'm using as a score.

I want to move the scoreLabelNode.text into another scene which is my loserScene.

My loserScene is set up like this:

    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)




    }
}

I am trying to print 'toPass' to test the string segue, but I just get nil.


回答1:


OK! So instead of using a segue. WHICH YOU CANNOT DO WITH AN SKSCENE. I used a struct. I put the struct outside of one of my scenes that I wanted data to be passed from, and made sure the data was being fed into the struct. I then accessed the struct from another scene and it works perfectly!

struct Variables {
static var aVariable = 0
}

this is the struct^ I have it set to 0 but it will be updated automatically when the score is recorded at the end of the run of my game. I then accessed it like so in another scene:

print(Variables.aVariable)

This prints the variable from the struct in my new scene. I can also turn this struct into a string and use it for a labelnode.




回答2:


Your toPass String returns nil because it is not initialized when you send the value from your prepareForSegue method.

Create a some function for example;

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

And add the property observers to your toPass variable. like this;

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

And add this function to your viewDidLoad method.

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


来源:https://stackoverflow.com/questions/32290460/how-do-i-pass-data-between-two-scenes-in-swift

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!