2016-05-23 11 views
1

ボタンのコックでフィールドのテキストを変更しようとしています ボタンが呼び出されてもラベルに古いテキストが表示されています。UIボタンで即時にラベルテキストを変更する

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

、あなたは現在のシーンを参照するのではなく、新しいインスタンスを作成していないので、何をやっていることは動作しません。 GameSceneシーンを呼び出し、そのインスタンスに対してchangeText()メソッドを呼び出すと、現在のシーンには影響しません。

あなたはUIKitの要素をSpriteKitと使用するべきであるかどうかについて常に議論があります。私はその話題には入っていませんが、一般的に、SpriteKitとUIKitは異なる獣です。両方のフレームワークが本当に好きだとしても、SpriteKitはゲームの面ではできるだけ多くのことを言います。例えば、SKSceneがノードをレンダリングする方法と、ビューのレンダリング方法との違いがあります。

伝統的なビューシステムでは、ビューの内容は に一度レンダリングされ、モデルの内容が変更されたときにのみレンダリングされます。 実際にはほとんどのビュー の内容が静的であるため、このモデルはビューではうまく機能します。一方、SpriteKitは、動的コンテンツに対して明示的に と設計されています。 SpriteKitは、 のシーンコンテンツを継続的に更新し、アニメーションがスムーズになり、正確な が確実に表示されるようにレンダリングします。

その他の違い:

異なる座標系。 ビューがビューに追加されます(シーンではありません)。 ビューにはノードが追加されません(ビューではありません)。

ビューのレンダリングサイクルの詳細については、hereをご覧ください。 SpriteKitがシーンをレンダリングする方法の詳細はhereです。

これらの違いのため、これらの2つを混在させるときに、異なる問題に(必ずしも当然ではありませんが)実行できます。 次の3つのソリューションを持っている(私は考えることができます):

1)IMO GameViewControllerr醜いソリューション内self.viewを通じて現在のシーンにアクセスするが、それは動作します:

@IBAction func someAction(sender: AnyObject) { 


     let skView = self.view as! SKView 

     if let currentScene = skView.scene as? GameScene { 

      currentScene.changeText() 
     } 
    } 

2)ニースのソリューションが、やはりこれは私の意見では、SKSpriteNodeを使ってカスタムボタンを実装しています。これについてSOだけを検索してください。

3)SKAButtonまたはAGSpriteButtonのようなサードパーティのSpriteKitボタンを使用します。

+0

ありがとうございます。あなたのオプション1は機能しませんでしたが、2番目のオプションに向かいましたが、今ではUIViewを使用する代わりにすべてをSpriteKitに変換しています。 –

+0

@Alexanderもしうまくいかないのなら、あなたはどこかでエラーがあるからです。それはうまくいくはずです、私はそれをテストしました。私たちがストーリーボードに別の設定をしているかもしれません...しかし、私が言ったように、私はオプション2をお勧めします。とにかくあなたが行く方法を決めたことを聞いてうれしい。これについてさらにご不明な点がございましたら、お気軽にお問い合わせください。 – Whirlwind

関連する問題