【问题标题】:Swift - can't get Game Center to showSwift - 无法让 Game Center 显示
【发布时间】:2015-01-12 22:38:57
【问题描述】:

我正在使用此代码让 Game Center 在用户按下按钮时出现。我想让这显示他们在排行榜上的高分:

@IBAction func showScores(x : UIButton) {
    var gameCenterController : GKGameCenterViewController!
    if (gameCenterController != nil) {
        gameCenterController.gameCenterDelegate = self
        self.presentViewController(gameCenterController, animated: true, completion: nil)
    }
}

但我在这一行得到一个错误:

gameCenterController.gameCenterDelegate = self

上面写着,

 Type 'MenuViewController' does not conform to protocol `GKGameCenterControllerDelegate`

我做错了什么?

如何将 GameCenter 应用到我的游戏中,以便将用户的高分添加到排行榜中,以便通过按下按钮查看他们?

【问题讨论】:

    标签: ios xcode delegates swift game-center


    【解决方案1】:

    确保声明您的呈现视图控制器符合 GKGameCenterControllerDelegate,如下所示:

    class MenuViewController: GKGameCenterControllerDelegate
    

    然后在 Swift 中,将以下函数添加到您的 MenuViewController:

    func gameCenterViewControllerDidFinish(gameCenterViewController: GKGameCenterViewController!)
    {
        //code to dismiss your gameCenterViewController
        // for example:
        gameCenterViewController.dismissViewControllerAnimated(true, completion: nil)
    }
    

    最后,请确保在呈现之前在游戏中心视图控制器上设置了 gameCenterDelegate。例如:

    var gcViewController: GKGameCenterViewController = GKGameCenterViewController()
    gcViewController.gameCenterDelegate = self
    

    请注意,委托是 gameCenterDelegate 而不仅仅是 delegate

    另外,这里有一个关于如何从 MenuViewController 显示排行榜的示例。 (此代码将在 MenuViewController 中):

    func showLeaderboard()
    {
        var gcViewController: GKGameCenterViewController = GKGameCenterViewController()
        gcViewController.gameCenterDelegate = self
    
        gcViewController.viewState = GKGameCenterViewControllerState.Leaderboards
        gcViewController.leaderboardIdentifier = "yourleaderboardid"
    
        self.presentViewController(gcViewController, animated: true, completion: nil)
    }
    

    【讨论】:

    • 我创建了一个新的 Cocoa Touch 类文件,名为 GameCenterViewController,子类 GKGameCenterViewController。然后我将第一行从GKGameCenterViewController 更改为GKGameCenterViewControllerDelegate,就像你在第一行代码中所说的那样。然而,这导致了很多错误——该行的第一个错误:"Use of undeclared type 'GKGameCenterViewControllerDelegate'"。我需要做什么?
    • 我认为你误解了如何使用上面的代码。在您的原始代码中,您有一个名为 MenuViewController 的 UIViewController。那就是您将从中呈现 GameCenterViewController 的视图控制器。你不需要子类化它。您示例中的“MenuViewController”和我示例中的YourViewController 是同一个视图控制器。 MenuViewController/YourViewController 应该采用 GKGameCenterControllerDelegate 协议。
    • 我编辑了原始答案以反映 YourViewController 与您示例中的 MenuViewController 相同。
    • 我在最后一行遇到语法问题:self.presentViewController(gcViewController, animated: true, completion: nil) 'MY_SCENE_CLASS' 没有名为 'presentViewController' 的成员
    • 在此示例中,MenuViewControllerUIViewController 的子类。似乎在您的代码中,您试图从没有 presentViewController 方法的 SKScene 的子类中呈现。看到这个问题:stackoverflow.com/questions/21089332/…。请为对您有帮助的答案投票。
    【解决方案2】:

    它说你没有实现委托方法。

    // Called when the player is done interacting with the view controller’s content. (required)
    - (void)gameCenterViewControllerDidFinish:(GKGameCenterViewController *)gameCenterViewController
    

    那么你的类可以这样实现:

    class YourViewController : GKGameCenterControllerDelegate
    {
        func gameCenterViewControllerDidFinish(gameCenterViewController: GKGameCenterViewController!)
        {
            // do somthing
        }
    }
    

    【讨论】:

    • 最重要的是Objective-C,不是吗?有 Swift 等价物吗?
    • 是的!我刚刚从苹果文档中复制。 reference
    • 有什么问题吗?第二块的代码是swift,不是吗?
    • 抱歉,我对 Swift 还很陌生,所以我很难从 Objective-C 中进行调整。什么是顶行的 Swift 等价物?
    • 我只是给你看GKGameCenterControllerDelegate的委托方法。此外,此方法应由您的类实现,如示例代码,根据苹果文档的要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多