当我的游戏结束时,我需要发送'将分数保存到表视图控制器的变量。我尝试通过
这样做//In LeaderboardTableVC.swift
var gameScore:Int! = 0
//In GameScene.swift
var leadVC: LeaderboardTableVC!
var score:Int = 0
func showLeaderboard(){
let sb = UIStoryboard(name: "Main", bundle: nil)
let leaderBoardVC = sb.instantiateViewController(withIdentifier: "leaderboard")
self.vc.navigationController?.pushViewController(leaderBoardVC, animated: true)
leadVC.gameScore = score
}
然而,当我运行代码时会发生错误:'在解开可选值时意外发现nil'关于' leadVC.gameScore =得分'代码行。有什么建议吗?
答案 0 :(得分:0)
您已实例化leaderBoardVC
,但从未设置leadVC
属性。因此,当您尝试设置leadVC
时,nil
仍为gameScore
,因此当它尝试强制解包此隐式展开的可选项时会崩溃。
leadVC
财产,这完全避免了这个问题。你为什么需要这个房产?无论如何,你可以这样做:
//In GameScene.swift
// var leadVC: LeaderboardTableVC!
var score:Int = 0
func showLeaderboard(){
let sb = UIStoryboard(name: "Main", bundle: nil)
guard let leaderBoardVC = sb.instantiateViewController(withIdentifier: "leaderboard") as? LeaderboardTableVC else {
fatalError("Either couldn't find scene with `leaderboard` identifier, or its base class was not `LeaderboardTableVC`")
}
leaderBoardVC.gameScore = score
self.vc.navigationController?.pushViewController(leaderBoardVC, animated: true)
}
注意,我可能会在推送之前设置gameScore
。
或者,如果你真的需要这个属性,你可以这样做:
//In GameScene.swift
var leadVC: LeaderboardTableVC!
var score: Int = 0
func showLeaderboard() {
let sb = UIStoryboard(name: "Main", bundle: nil)
leadVC = sb.instantiateViewController(withIdentifier: "leaderboard")
leadVC.gameScore = score
self.vc.navigationController?.pushViewController(leadVC, animated: true)
}
这就引出了一个问题:为什么你要对这个leadVC
保持强烈的引用(例如,当你回弹时,它会把它留在记忆中)。