使用SpriteKit - ViewController问题将Swift中的GameCenter与NSNotification集成

时间:2015-12-21 14:15:07

标签: ios swift sprite-kit game-center nsnotifications

我尝试了很多方法让游戏中心在SpriteKit游戏中运行。不幸的是,我过去使用ObjC和ViewControllers的方式不起作用,因为我使用的是SKScene / GameScene。

这是代码的快速版本(我认为):

// MARK: Game Center Integration

//login and make available
func authenticateLocalPlayer(){
    let localPlayer = GKLocalPlayer()
    print(localPlayer)
    localPlayer.authenticateHandler = {(viewController, error) -> Void in
        if ((viewController) != nil) {
            self.presentViewController(viewController!, animated: true, completion: nil)
        }else{
            print((GKLocalPlayer.localPlayer().authenticated))
        }
    }
}

//submit a score to leaderboard
func reportScoreToLeaderboard(thisScore:Int){
    if GKLocalPlayer.localPlayer().authenticated {
        let scoreReporter = GKScore(leaderboardIdentifier: "LeaderboardID")
        scoreReporter.value = Int64(thisScore)
        let scoreArray: [GKScore] = [scoreReporter]

        GKScore.reportScores(scoreArray, withCompletionHandler: { (error: NSError?) -> Void in
            if error != nil {
                print(error!.localizedDescription)
            } else {
                print("Score submitted")
            }
        })
    }
}

//show leaderboard (call from button or touch)
func showLeaderboard() {
    let vc = self.view?.window?.rootViewController
    let gc = GKGameCenterViewController()
    gc.gameCenterDelegate = self
    vc?.presentViewController(gc, animated: true, completion: nil)
} 

//hides view when finished
func gameCenterViewControllerDidFinish(gameCenterViewController: GKGameCenterViewController){
    gameCenterViewController.dismissViewControllerAnimated(true, completion: nil)
}

不幸的是,无论我尝试什么,我都会得到这个错误:

  

不允许在取消分配时尝试加载视图控制器的视图,并且可能导致未定义的行为

......或者只是崩溃。

我读过可以使用NSNotifications吗?但是如何?

我猜测最好的方法是在GameViewController.swift中设置它并使用NSNotifications与GameScene中的RootViewController进行通信?我似乎无法找到教程或示例。

1 个答案:

答案 0 :(得分:1)

当视图控制器需要更改视图时,使用委托,没有视图本身更改视图,这可能导致视图在呈现新视图时尝试解除分配,从而导致出现错误