GKGameCenterViewController始终显示挑战而不是排行榜

时间:2013-03-25 22:52:31

标签: ios objective-c uiviewcontroller game-center

我正在使用Apple's code来展示GKGameCenterViewController

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

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

  

您的视图控制器(iOS)显示游戏中心用户界面

     

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

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

GameCenter Challenges Screen

我也试过这段代码:

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

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

enter image description here

我是否误解了某些事情或者我做错了什么?第一段代码不应该把我带到主菜单吗?为什么不显示排行榜?

更新

我按照phix23的建议实施了viewState

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

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

4 个答案:

答案 0 :(得分:1)

自iOS 6开始提供的GKGameCenterViewController可以显示启用游戏中心的应用程序的排行榜,成就和挑战。

您可以通过设置viewState的{​​{1}}来更改初始视图。如果您未设置此属性,它将显示默认视图,这是您的案例中的质询视图。我猜你没有设置任何排行榜或成就,所以没有任何东西可以显示。

答案 1 :(得分: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];
     }  
}

答案 2 :(得分: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

答案 3 :(得分: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 参数必须设置为某个活动视图控制器)。

希望这有帮助。