【问题标题】:Trouble passing variable through segue (Swift)通过 segue (Swift) 传递变量时遇到问题
【发布时间】:2017-08-15 20:19:11
【问题描述】:

我在我的程序顶部有一个名为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。

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

【问题讨论】:

    标签: ios iphone swift


    【解决方案1】:

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

    【讨论】:

    • func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { if (segue.identifier == "EndScreenSegue") { let secondViewController = segue.destination as! EndScreen correctAnswers = sender as! Int secondViewController.correctAnswers = correctAnswers } } 我这样做了,但正确答案始终为零
    【解决方案2】:

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

    您要么需要将GameScreen 传递给segue(假设您从GameScreen 进行segue),如下所示:

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

    【讨论】:

    • 好的,我添加了您的代码,并尝试使用 gso = gameScreen() 和不使用。两次都没有将值传递给新的视图控制器。
    【解决方案3】:

    您正在创建一个新的 GameScreen 实例。

    从 viewDidLoad 中删除这一行 gso = GameScreen()

    【讨论】:

    • 我这样做了,它只是提供了默认值而不是 0。
    • 这是一个非常长的文件,您具体要找什么?我可以告诉你,正确的答案变量在顶部声明为等于 0,然后我有一个函数,每次调用它时,它都会为正确答案变量添加 +1。我还应该注意,我没有在要添加到已经存在的变量的函数内部重新声明变量。
    • @RichardParker 我认为问题出在 GameScreen 类而不是 prepareForSegue
    • 当我为 segue 做准备工作时,我认为他们可能更改了 prepareForSegue 之类的东西,因为我认为代码没有做任何事情。
    • @RichardParker 我想我在你的原始帖子中找到了问题正确答案 = 发件人为! Int secondViewController.gso = self 现在您将 self 传递给 secondView 控制器,如果不是 GameScreen 对象,则传递 self 。这就是为什么它总是打印零。这不是为转场做准备的问题
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-04
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多