7

我正在使用Apple 的代码来显示GKGameCenterViewController

GKGameCenterViewController *gameCenterController = [[GKGameCenterViewController alloc] init];
if (gameCenterController != nil) {
    gameCenterController.gameCenterDelegate = self;
    [self presentViewController:gameCenterController animated:YES completion:nil];
}

这是描述上述代码的文本:

Game Center UI 由您的视图控制器显示 (iOS)

Game Kit 使用的约定是让您的视图控制器之一呈现 Game Kit 视图控制器。您的视图控制器充当它呈现的视图控制器的委托,以便在玩家完成查看呈现的屏幕时通知它。清单 2-1 显示了这种模式最常见的用途,即显示 Game Center 用户界面。Game Center 视图控制器显示许多不同的 Game Center 内容,因此大多数游戏都应该提供一个按钮,将玩家带到此屏幕,即使游戏还使用自定义用户界面显示 Game Center 内容。

当我使用推荐的代码时,我进入了这个屏幕(GameCenter Challenges),这不是我想要的:

GameCenter 挑战屏幕

我也试过这段代码:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"gamecenter:"]];

通过使用该代码,我进入了我希望显示的屏幕:

在此处输入图像描述

我误解了什么还是我做错了什么?第一段代码不应该把我带到主菜单吗?为什么不显示排行榜?

更新

我按照phix23viewState的建议实施:

GKGameCenterViewController *gameCenterController = [[GKGameCenterViewController alloc] init];
if (gameCenterController != nil) {
    gameCenterController.gameCenterDelegate = self;
    gameCenterController.viewState = GKGameCenterViewControllerStateLeaderboards;
    [self presentViewController:gameCenterController animated:YES completion:nil];
}

但是,它仍然显示相同的挑战屏幕,尽管我想/尝试显示排行榜屏幕。

4

4 回答 4

1

从 iOS 6 开始可用,GKGameCenterViewController它可以显示支持游戏中心的应用程序的排行榜、成就和挑战。

viewState您可以通过设置的来更改初始视图GKGameCenterViewController。如果您不设置此属性,它将显示默认视图,即您的案例中的挑战视图。我猜你没有设置任何排行榜或成就,所以没有什么可以显示的。

于 2013-03-25T23:05:44.213 回答
0

对于 iOS 7.0,我使用以下内容:

显示排行榜:

- (void)displayLeaderboard:(UIViewController *)viewController
{
    GKGameCenterViewController *gameCenterController = [[GKGameCenterViewController alloc] init];
    if (gameCenterController != nil) {
        gameCenterController.gameCenterDelegate = self;
        gameCenterController.viewState = GKGameCenterViewControllerStateLeaderboards;
        [viewController presentViewController:gameCenterController animated:YES completion:nil];
    }
}

展示成果:

- (void)displayAchievements:(UIViewController *)viewController
{
    GKGameCenterViewController *gameCenterController = [[GKGameCenterViewController alloc] init];
    if (gameCenterController != nil) {
        gameCenterController.gameCenterDelegate = self;
        gameCenterController.viewState = GKGameCenterViewControllerStateAchievements;
        [viewController presentViewController:gameCenterController animated:YES completion:nil];
    }
}

请注意,尝试使用这些功能的视图控制器将需要传递自身(即viewController参数必须设置为某个活动视图控制器)。

希望这可以帮助。

于 2014-03-26T00:35:29.397 回答
0

使用GKGameCenterViewController和设置视图状态:

//Create a leaderboard view controller
GKGameCenterViewController *leaderboardViewController = [[GKLeaderboardViewController alloc] init];
leaderboardViewController.viewState = GKGameCenterViewControllerStateLeaderboards;

//Set the time scope (ex. All Time, This Week, Today) and the leaderboard ID
leaderboardViewController.timeScope = GKLeaderboardTimeScopeAllTime;
leaderboardViewController.leaderboardCategory = leaderboardID;

//Set the delegate so we can handle various actions including dismissal
leaderboardViewController.leaderboardDelegate = self;

//Present the view controller
[self presentViewController:leaderboardViewController animated:YES completion:nil];

此代码将显示一个视图控制器,显示您的所有游戏排行榜(或排名,如果只有一个)。您还可以设置属性,例如要显示的排行榜、时间范围、委托等。另外请注意,您可以使用GKAchievementViewController.

您在问题中提供的代码,

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"gamecenter:"]];

启动 GameCenter 应用程序。这意味着 iOS 将退出您的应用程序并切换到 GameCenter。这可能会让用户感到困惑。您还应该避免让用户离开您的应用程序。相反,请使用在GKViewControllers您的应用程序内部以模态方式呈现的内容。

于 2013-04-28T16:44:09.763 回答
0

尝试使用此代码:

-(void)showGameCentersDefaultPage {
    GKGameCenterViewController *gameCenterController = [[GKGameCenterViewController alloc] init];
     if (gameCenterController != nil) {
           gameCenterController.gameCenterDelegate = self;
           gameCenterController.viewState = GKGameCenterViewControllerStateDefault;
           [self presentViewController:gameCenterController animated:YES completion:nil];
      }
}

如果您想从特定类型的 GameCenter 排行榜开始,您可以使用您的leaderboardID调用以下方法

- (void)showLeaderboard:(NSString*)leaderboardID {
    GKGameCenterViewController *gameCenterController = [[GKGameCenterViewController alloc] init];
    if (gameCenterController != nil) {
        gameCenterController.gameCenterDelegate = self;
        //The next three lines are the lines of interest...
        gameCenterController.viewState = GKGameCenterViewControllerStateDefault;
        gameCenterController.leaderboardTimeScope = GKLeaderboardTimeScopeToday;
        gameCenterController.leaderboardCategory = leaderboardID;
        [self presentViewController:gameCenterController animated:YES completion:nil];
     }  
}
于 2013-03-26T04:22:30.423 回答