尝试在故事板之间从变量传输数据时出错

时间:2016-04-15 16:33:35

标签: ios swift variables storyboard segue

我有一个游戏,我将玩家的高分值存储为#34; highScore",在第一个视图控制器中。

我想要做的是尝试将此可变数据传输到第二个视图控制器。

我在第一个视图控制器的故事板中输入了以下代码。

Btw,highscore2,是我在第二个视图控制器中显示的变量,用于存储来自第一个高分变量的数据。:

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

出于某种原因,代码会编译,但不会显示高分,并且是" nil"。

3 个答案:

答案 0 :(得分:1)

避免强行打开。

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

然后放入一个断点并确保你得到所有这些线。

答案 1 :(得分:0)

如果我没记错的话,viewDidLoad方法只在首次初始化视图控制器时被调用一次。因此,您要在highScoretwolbl实际拥有任何数据之前设置highScore2变量,这就是为什么它为零。

我建议在viewWillAppear内设置文本,以便每次发生segue时都会更新。

类似

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

以下是对视图控制器的所有方法的生命周期的引用。 View controller lifecycle

答案 2 :(得分: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
    }
}