在UI按钮上即时更改标签文本单击

时间:2016-05-23 20:01:01

标签: ios swift sprite-kit

我正在尝试更改按钮cick上的字段文本 按钮被调用,但标签显示旧文本。

如果我使用NSUserDefaults来保存值,那么我将不得不关闭应用程序并重新打开它以查看文本字段的新值。

当用户按下某个按钮时,是否有任何方法可以在屏幕上立即重置该值?

GameViewController代码

import UIKit
import SpriteKit

class GameViewController: UIViewController {


    @IBOutlet var resetText: UIButton!
    @IBAction func ResetTextPreseed(sender: AnyObject) {
        GameScene().changeText()

    }



    override func viewDidLoad() {
        super.viewDidLoad()

        if let scene = GameScene(fileNamed:"GameScene") {
            // Configure the view.
            let skView = self.view as! SKView
            skView.showsFPS = true
            skView.showsNodeCount = true

            /* Sprite Kit applies additional optimizations to improve rendering performance */
            skView.ignoresSiblingOrder = true

            /* Set the scale mode to scale to fit the window */
            scene.scaleMode = .AspectFill

            skView.presentScene(scene)
        }
    }

    override func shouldAutorotate() -> Bool {
        return true
    }

    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        if UIDevice.currentDevice().userInterfaceIdiom == .Phone {
            return .AllButUpsideDown
        } else {
            return .All
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Release any cached data, images, etc that aren't in use.
    }

    override func prefersStatusBarHidden() -> Bool {
        return true
    }
}

GameScene代码

import SpriteKit

class GameScene: SKScene {

    let myLabel = SKLabelNode(fontNamed:"Chalkduster")
    var text = "Hello, WOrld"

    override func didMoveToView(view: SKView) {
        /* Setup your scene here */
                myLabel.text = text
        myLabel.fontSize = 45
        myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))

        self.addChild(myLabel)
    }

        override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
    }

    func changeText(){
        text = "I got changed"
        myLabel.text = text
       self.addChild(myLabel)
        print ("The value of text is \(text)")
    }
}

1 个答案:

答案 0 :(得分:2)

目前,您正在做的事情不会起作用,因为您没有引用当前场景,而是创建GameScene场景的新实例并在该实例上调用changeText()方法,这没有任何效果在当前的场景中。

关于您应该或不应该将UIKit元素与SpriteKit一起使用,总是存在争议。我不会讨论这个话题,但总的来说,SpriteKit和UIKit是不同的野兽,即使我真的喜欢这两个框架,我只会尽可能多地坚持SpriteKit游戏......以及一些差异。 ..例如,SKScene渲染节点的方式与渲染视图的方式之间存在差异。来自文档的一些引用:

  

在传统视图系统中,呈现视图的内容   只有当模型的内容发生变化时才会再次渲染。   此模型非常适用于视图,因为在实践中大多数视图   内容是静态的。另一方面,SpriteKit是专为设计的   明确表示动态内容。 SpriteKit不断更新   场景内容并呈现它以确保动画是平滑的   准确。

更多差异:

不同的坐标系。 视图将添加到视图(而不是场景)。 节点将添加到场景中(而不是视图)。

有关视图渲染周期的更多信息,请参见here。 有关SpriteKit如何渲染场景的更多信息,请参见here

因此,由于这些差异,当混合这两者时,你可能会(当然不一定)遇到不同的问题。 你有三个解决方案(我能想到):

1)通过GameViewControllerr丑陋的解决方案IMO中的self.view访问当前场景,但它会起作用:

@IBAction func someAction(sender: AnyObject) {


        let skView = self.view as! SKView

        if let currentScene = skView.scene as? GameScene {

            currentScene.changeText()
        }
    }

2)很好的解决方案,但这只是我的意见 - 使用SKSpriteNode实现自定义按钮。只是搜索一下这个。

3)使用第三方SpriteKit按钮,例如SKAButtonAGSpriteButton