当我的游戏结束时,我需要发送'将分数保存到表视图控制器的变量

时间:2016-09-24 17:28:10

标签: ios swift uitableview sprite-kit

当我的游戏结束时,我需要发送'将分数保存到表视图控制器的变量。我尝试通过

这样做
//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 =得分'代码行。有什么建议吗?

1 个答案:

答案 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保持强烈的引用(例如,当你回弹时,它会把它留在记忆中)。