2016-04-15 13 views
0

最初のビューコントローラーで、プレーヤーのハイスコアの値を「ハイスコア」として保存するゲームがあります。ストーリーボード間の変数からデータを転送しようとしたときにエラーが発生しました

私がしたいことは、この変数データを2番目のView Controllerに転送しようとすることです。

最初のビューコントローラのストーリーボードに次のコードを入力しました。

ところで、highscore2は、私が最初にハイスコア変数からのデータを格納するために、第2のビューコントローラにdelcared可変:

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

       svc.highScore2 = "High Score \(highScore)" 

      } 
} 

すぐここで私の第2のビューコントローラ(viewTwoのコードがです):

class viewTwo: UIViewController 
{ 



    @IBOutlet var highScoretwolbl: UILabel! 

    var highScore2:String! 



    override func viewDidLoad() { 
      highScoretwolbl.text = highScore2 
    } 
} 

何らかの理由で、コードがコンパイルされますが、ハイスコアが表示されず、「ゼロ」です。

+0

どのような種類のセグを使用していますか?ショー(プッシュ)、詳細表示(置き換え)、現在のモーダル表示、ポップオーバー?それが 'ショー'ならば、それはうまくいくはずです! – D4ttatraya

+0

ええ、私は表示しました – sdksmkfnajnf

答えて

0

他の回答に記載されているように、viewDidLoadは1回だけ起動されます。 は強制的にアンラップした文字列を使用しているため、最初はnilです。あなたがそれを設定するまで、それは viewDidLoadの後に値を取得しません(highScore2)。いくつかのprint文を追加すると、一連のイベントを見ることができます。

あなたの最善の選択肢は、viewWillAppearを使用することです。これはあなたのビューが表示されるたびに解雇されます。 これはあなたが望むものです。

force unwrapped変数を使用する必要はありません。文字列を にして最初は空にします。

override func prepareForSegue(segue: UIStoryboardSegue, sender:AnyObject?) 
{ 
    if segue.identifier == "segueTest" 
    { 
     if let svc = segue.destinationViewController as? viewTwo { 
      print("setting score in prepareForSegue") 
      svc.highScore2 = "High Score \(highScore)" 
     } 
     else { 
      print("something bad happened") 
     } 
    } 
} 


class viewTwo: UIViewController 
{ 


    @IBOutlet var highScoretwolbl: UILabel! 

    // The following uses forced upwrapping which means it could be nil 
    // if you never set it and your app will crash. 
    // var highScore2: String! 
    // Instead, do this: 
    var highScore2: String = "" 

    override func viewWillAppear(animated: Bool) { 
     // putting this here will ensure that every time the screen 
     // is shown, the label will get set from the string. 
     highScoretwolbl.text = highScore2 
    } 
} 
+0

、viewWillAppearではなく、uはviewDidLoadを意味しましたか?関数には、オーバーライドするためのviewWillAppearという名前の関数がないため、 – sdksmkfnajnf

+0

私のバグは、関数にパラメータを追加するのを忘れていましたが、何らかの理由で空白のテキストフィールドが表示されます – sdksmkfnajnf

+0

これは正しい方法です。これをデバッグする必要があります。途中でprintステートメントを追加して、渡された値と受け取った値を確認します。以下は簡単な例です:https://github.com/ryantxr/legendary-potato – ryantxr

0

正しく呼び出すと、viewDidLoadメソッドは、ビューコントローラが最初に初期化されたときに1回だけ呼び出されます。だからhighScore2に実際にデータがある前に変数highScoretwolblを設定しているので、これはnilです。

テキストをviewWillAppearに設定することをお勧めします。これは、セグが発生するたびに更新されます。

だから、ここで

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(true) 
    highScoretwolbl.text = highScore2 
} 

のようなものは、ビューコントローラのすべてのメソッドのライフサイクルへの参照です。 View controller lifecycle

+0

何らかの理由で、まだ空白のテキストフィールドを表示します – sdksmkfnajnf

1

強制アンラッピングを避ける。

if let svc = segue.destinationViewController as? viewTwo{ 
    svc.highScore2 = "High Score \(highScore)" 
} 

次に、ブレークポイントを設定して、これらの行をすべて確認してください。

+0

何らかの理由で、それでもまだ動作しません:( – sdksmkfnajnf

関連する問題