我有一个游戏,我将玩家的高分值存储为#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"。
答案 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
}
}