【问题标题】:Integrating GameCenter in Swift with NSNotification, using SpriteKit - ViewController issue使用 SpriteKit - ViewController 问题将 Swift 中的 GameCenter 与 NSNotification 集成
【发布时间】:2015-12-21 14:15:07
【问题描述】:

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

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

// 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 进行通信?不过,我似乎找不到教程或示例。

【问题讨论】:

  • 好吧,错误告诉您出了什么问题,您在解除分配时正在视图控制器上呈现视图。我想指出这个let vc = self.view?.window?.rootViewController 是不好的做法。这可能是您的错误所在,因为 self.view 很可能在您展示游戏中心视图控制器时解除分配
  • 我知道这是不好的做法,但是我发现的任何显示快速实现的资源都使用它...我不确定是否可以从 GameScene 内部实现 GC
  • 当然可以,我已经在你问的另一个问题中讨论过委托,同样的规则适用于 GC
  • 我认为我的问题是,我的gameViewController 没有viewDidLoad,它使用override func viewWillLayoutSubviews() 然后viewDidLoadGameScene: SKScene 类中...
  • 这并不能回答您的核心问题,但您在authenticateLocalPlayer() 中有一个共同的缺陷。您假设如果 viewController 为 nil,则用户已通过身份验证。但是,如果设置了错误代码,则 viewController 通常(总是?)为零。因此,验证错误将在您的代码中使用空 VC 并被视为成功。您需要先检查error 的值。如果你不这样做,它最终会回来困扰你。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多