2017-08-15 119 views
1

我有一个变量名为correctAnswers = 0在我的程序的顶部,我有一个函数,每次它被称为它将correctAnswers值加1。我测试了这个函数实际上是通过在每个+1之后打印这个变量来改变这个变量,并且确定它变为1,2,3,4等等。但是我有一个结束的屏幕,显示该程序后的结果(在这种情况下10)已达到其问题极限麻烦传递变量通过segue(Swift)

编辑#2:这里是我的赛格瑞功能准备

func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { 
    if (segue.identifier == "EndScreenSegue") { 
     let secondViewController = segue.destination as! EndScreen 
     correctAnswers = sender as! Int 
     secondViewController.gso = self 
    } 
} 

这里是代码在我结束画面:

var gso: GameScreen? 

override func viewDidLoad() { 
    super.viewDidLoad() 
    gso = GameScreen() 
    print(gso?.correctAnswers ?? 100) 

} 

当我打印正确的答案仍然是0。

编辑#3我也尝试过将其通过赛格瑞的这个方法,它是总是零。它不工作的事实与变量在函数中被改变的事实有什么关系?这是我可以想到解释为什么没有任何工作的唯一原因。

func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { 
    if (segue.identifier == "EndScreenSegue") { 
     let secondViewController = segue.destination as! EndScreen 
     secondViewController.recievedAnswers = correctAnswers 
    } 
} 

class EndScreen: UIViewController{ 

    var recievedAnswers: Int! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     print(recievedAnswers!) 

    } 
} 

编辑#4想通了!我认为。 看来他们改变了prepareForSegue,它不再有效,但xcode不会给你一个错误?是否应该发布另一篇文章呢?实际工作 代码:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "EndScreenSegue"{ 
     let secondViewController = segue.destination as! EndScreen 
     secondViewController.recievedAnswers = correctAnswers 
    } 
} 

回答

1

你在你的EndScreen视图控制器的viewDidLoad方法创建GameScreen的新实例。您需要将GameScreen对象从您之前的视图控制器传递到此视图控制器。

+0

'FUNC prepareForSegue(赛格瑞:UIStoryboardSegue!发信人:AnyObject){ 如果(segue.identifier == “EndScreenSegue”){ 让secondViewController = segue.destination作为! EndScreen correctAnswers =发件人为! Int secondViewController。'我做了这个,correctAnswers总是零 –

0

在您的segue中,您正在设置EndScreen视图控制器的correctAnswers属性,但是您打印的值为gso?.correctAnswers。一个新的gso刚刚在此打印语句之前实例化,并且(我假设)具有默认值0,这就是为什么您打印出0的原因。

你要么需要通过SEGUE传递GameScreen(假设你从GameScreen segueing),像这样:

func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { 
    if (segue.identifier == "EndScreenSegue") { 
     let secondViewController = segue.destination as! EndScreen 
     correctAnswers = sender as! Int 
     secondViewController.gso = self 
    } 
} 

或者,你可以通过SEGUE通过correctAnswers为你做但一定要使用该值,而不是gso?.correctAnswers

class EndScreen: UIViewController{ 

    var correctAnswers: Int? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     print(correctAnswers ?? 100) 
    } 
} 
+0

好吧,我添加了你的代码,并且用gso = gameScreen()和没有尝试过。这两次都没有将值传递给新的视图控制器。 –

0

您正在创建GameScreen的新实例。

从viewDidLoad中

+0

我这样做了,它只是提供了默认值而不是0. –

+0

你可以分享GameScreen – OverD

+0

的代码,它是一个非常非常长的文件,你在找什么?我可以告诉你,correctAnswers变量在顶部声明为0,然后我有一个函数,每次调用它时,它都会将+1添加到correctAnswers变量中。我还应该注意到,我不是在我已经添加到已经存在的变量中的函数内部重新声明变量。 –

0

删除此行gso = GameScreen()出于某种原因,它看起来像prepareForSegue不再起作用,但是当你使用它的Xcode不给错误。正确的格式是现在:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "EndScreenSegue"{ 
     let secondViewController = segue.destination as! EndScreen 
     secondViewController.recievedAnswers = correctAnswers 
    } 
}