Search code examples
iosobjective-cgame-centergame-center-leaderboard

I am unable to dismiss a GameCenter leaderboard/view


GameCenter is able to open. However, when the "done" button is pressed on the top right corner to dismiss GameCenter, GameCenter still remains open. How do I close GameCenter?

Below is my code:

- (void) presentLeaderboards
{
    GKGameCenterViewController *leaderboardController = [[GKGameCenterViewController alloc] init];
    if (leaderboardController != nil)
    {
        leaderboardController.viewState = GKGameCenterViewControllerStateLeaderboards;
        UIViewController *vc = self.view.window.rootViewController;
        [vc presentViewController: leaderboardController animated: YES completion:nil];
    }
}

- (void)gameCenterViewControllerDidFinish:(GKGameCenterViewController *)viewController
{
    NSLog(@"Close");
    UIViewController *vc = self.view.window.rootViewController;
    [vc dismissViewControllerAnimated:YES completion:nil];
}

Solution

    1. You never set a delegate for your GKGameCenterViewController so your gameCenterViewControllerDidFinish: method is never called. You should have found this yourself through a little debugging.

    2. Call dismissViewControllerAnimated on viewController.

    Your code should be more like:

    - (void) presentLeaderboards
    {
        GKGameCenterViewController *leaderboardController = [[GKGameCenterViewController alloc] init];
        if (leaderboardController != nil)
        {
            leaderboardController.gameCenterDelegate = self;
            leaderboardController.viewState = GKGameCenterViewControllerStateLeaderboards;
            UIViewController *vc = self.view.window.rootViewController;
            [vc presentViewController: leaderboardController animated: YES completion:nil];
        }
    }
    
    - (void)gameCenterViewControllerDidFinish:(GKGameCenterViewController *)viewController
    {
        NSLog(@"Close");
        [viewController dismissViewControllerAnimated:YES completion:nil];
    }
    

    Adding the line:

    leaderboardController.gameCenterDelegate = self;
    

    may lead to a new error. If so, you need to add the following to the .m before the @implementation line.

    @interface MyViewControllerNameHere () <GKGameCenterControllerDelegate>
    
    @end
    

    If you already have the class extension, just add the GKGameCenterControllerDelegate part.