2016-04-15 32 views
0

我有一款遊戲,我在第一個視圖控制器中將玩家的高分值存儲爲「highScore」。嘗試從故事板之間的變量傳輸數據時出錯

我想要做的就是嘗試將這個可變數據傳送到第二個視圖控制器。

我在第一個視圖控制器的故事板中輸入了以下代碼。

順便說一句,highscore2,是我在第二視圖控制器delcared可變,從第一可變高分:

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

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

      } 
} 

現在,這裏存儲的數據是在我的第二視圖控制器的代碼(viewTwo ):

class viewTwo: UIViewController 
{ 



    @IBOutlet var highScoretwolbl: UILabel! 

    var highScore2:String! 



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

出於某種原因,代碼編譯,但高分不顯示,爲「無」。

+0

您使用哪種類型的賽格?顯示(推),顯示細節(替換),現在模態,彈出?如果它是'秀',那麼它應該工作! – D4ttatraya

+0

是的,我沒有顯示 – sdksmkfnajnf

回答

0

正如其他答案所述,viewDidLoad只會被觸發一次。由於您的 正在使用強制解包字符串,因此最初爲零。它(highScore2)將不會得到一個值,直到你設置它發生的 viewDidLoad。添加一些打印語句,以便您可以看到事件的順序。

你最好的選擇是使用viewWillAppear。每當您的視圖出現 時,這會被觸發。這是你想要的。

你不需要使用強制解包變量。只需將一個字符串 初始化爲空。

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,你的意思是viewDidLoad?它說,它不能覆蓋函數,因爲沒有名爲viewWillAppear的函數可以覆蓋 – sdksmkfnajnf

+0

我的錯誤,我忘了將參數添加到函數中,但由於某種原因,它仍然顯示爲空白文本字段 – sdksmkfnajnf

+0

這是正確的方法。必須調試這個。沿途添加打印語句以查看傳遞和接收的值。下面是一個簡單的例子:https://github.com/ryantxr/legendary-potato – ryantxr

0

如果我正確記得,當視圖控制器第一次初始化時,viewDidLoad方法只被調用一次。所以你在設置highScoretwolbl變量之前highScore2實際上有任何數據,這就是爲什麼它是零。

我建議設置viewWillAppear以內的文本,以便每次發生segue時更新。

因此,像

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