2016-05-23 3 views
1

Я пытаюсь изменить текст поля на кнопке 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)") 
    } 
} 

ответ

2

В настоящее время, что вы делаете, не будет работать, потому что вы не ссылки на текущую сцену, а сделать новый экземпляр a GameScene сцена и вызов метода changeText() в этом случае, который не влияет на текущую сцену.

Всегда есть споры о том, следует ли вам или не использовать UIKit элементов с SpriteKit. Я бы не стал заниматься этой темой, но, в общем, SpriteKit и UIKit - это разные звери, и даже если мне действительно нравятся оба фреймворка, я буду придерживаться SpriteKit, насколько это возможно, когда дело касается игр ... И о некоторых отличиях. .. Например, существует разница между тем, как SKScene отображает свои узлы против того, как визуализируются представления. Некоторые цитаты из документации:

В традиционной системе зрения, содержимое представлений отображаются один раз, а затем снова оказываются только при изменении содержимого модели. Эта модель очень хорошо работает для просмотров, потому что на практике большинство просмотров контента является статическим. С другой стороны, SpriteKit специально сконфигурировал для динамического контента. SpriteKit постоянно обновляет содержимое сцены и отображает его, чтобы обеспечить плавность анимации и точность .

Другие отличия:

Различные системы координат. Представления добавляются в представления (а не в сцену). Узлы добавляются к сцене (а не к виду).

Подробнее о цикле рендеринга представления можно найти here. Подробнее о том, как SpriteKit создает сцену, можно найти here.

Так что из-за этих различий вы можете бежать (не обязательно, конечно) в разные проблемы при смешивании этих двух. У вас есть три решения (я могу думать):

1) Доступ к текущей сцене через self.view внутри Гадкие решений GameViewControllerr ИМО, но он будет работать:

@IBAction func someAction(sender: AnyObject) { 


     let skView = self.view as! SKView 

     if let currentScene = skView.scene as? GameScene { 

      currentScene.changeText() 
     } 
    } 

2) Nice решения, но опять-таки это просто мое мнение - реализация пользовательских кнопок с помощью SKSpriteNode. Просто найдите SO об этом.

3) Используйте сторонние кнопки SpriteKit, такие как SKAButton или AGSpriteButton.

+0

спасибо. Ваш вариант 1 не работал, но я пошел на второй вариант, и теперь я конвертирую все в SpriteKit вместо использования UIView. –

+0

@Alexander Если это не сработало, это потому, что у вас где-то ошибка. Он должен работать, я его протестировал. Может быть, у нас разные настройки в раскадровке ... Но, как я уже сказал, я бы рекомендовал вариант два. В любом случае рад услышать, как вы решили, куда идти. Если у вас возникнут дополнительные вопросы, не стесняйтесь спрашивать. – Whirlwind

Смежные вопросы