我正在尝试更改按钮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)")
}
}
答案 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按钮,例如SKAButton或AGSpriteButton。