麻烦通过segue传递变量(Swift)

时间:2017-08-15 20:19:12

标签: ios iphone swift

我的程序顶部有一个名为correctAnswers = 0的变量,我有一个函数,每次调用它时,它会在correctAnswers值上加1。我测试过该函数实际上是通过在每+1后打印它来改变变量,并且确定它变为1,2,3,4等等。但是我有一个结束屏幕,显示程序达到问题限制后的结果(在这种情况下为10)

编辑#2:这是我准备segue功能

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我也试过这种方法将它传递给一个segue,它总是为零。它不起作用的事实是否与变量在函数中被更改的事实有关?这就是我可能想到的唯一理由来解释为什么没有任何效果。

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
    }
}

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

您需要将GameScreen传递给segue(假设您正在从GameScreen发出信号),如下所示:

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

或者你可以在你正在做的时候将correctAnswers传递给segue,但一定要使用该值,而不是gso?.correctAnswers

class EndScreen: UIViewController{

    var correctAnswers: Int?

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

答案 2 :(得分:0)

您正在创建GameScreen的新实例。

从viewDidLoad

中删除此行gso = GameScreen()

答案 3 :(得分:0)

由于某些原因,看起来prepareForSegue不再有效,但xcode在您使用它时不会出错。现在正确的格式是:

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