An attempt to present a GKGameCenterViewController on a UIViewController whose view is not in the window hierarchy

I am having problems displaying the Game Center leaderboard when a user clicks a button on my SecondViewController (game with a screen with a score / top score). UIbutton is the ShowLeaderboard, which you will see below.

The error I get is:

Warning: Attempt to present <GKGameCenterViewController: 0x7fb1c88044a0> on <UIViewController: 0x7fb1c2624e90> whose view is not in the window hierarchy!

I tried to decline the view first, but no matter what I do, I can’t just show the leaders view. Below is my SecondViewController code:

import UIKit
import GameKit

class SecondViewController: UIViewController, GKGameCenterControllerDelegate {


@IBOutlet var scoreLabel: UILabel!
@IBOutlet var HighScoreLabel: UILabel!
var receivedString: String = ""
var receivedHighScore: String = ""


override func viewDidLoad() {
    super.viewDidLoad()
    scoreLabel.text = receivedString
    HighScoreLabel.text = receivedHighScore

}


@IBAction func ShowLeaderboard(sender: UIButton) {
    dismissViewControllerAnimated(true, completion:nil)
    showLeader()
}


func showLeader() {
    var vc = self.view?.window?.rootViewController
    var gc = GKGameCenterViewController()
    gc.gameCenterDelegate = self
    vc?.presentViewController(gc, animated: true, completion: nil)
}



func gameCenterViewControllerDidFinish(gameCenterViewController: GKGameCenterViewController!)
{
    gameCenterViewController.dismissViewControllerAnimated(true, completion: nil)

}






override func prefersStatusBarHidden() -> Bool {
    return true
}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}


@IBAction func retryButton(sender: AnyObject) {
    self.dismissViewControllerAnimated(true, completion: nil)
}
}

EDIT . He works! All I had to do was change

var vc = self.view?.window?.rootViewController

to

var vc = self
+4
source share
2

, , Leaderboard , dismissViewControllerAnimated . showLeader() dismissViewControllerAnimated.

0
Here is my Code. Hope it helps! 

if (self.levelGameAttemptCount == 3)
                    {
                        self.canRestart = false

                        let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
                        let vc = mainStoryboard.instantiateViewControllerWithIdentifier("gameOverControllerID") as! GameOverController
                        self.view!.window!.rootViewController!.dismissViewControllerAnimated(false, completion: nil)
                        UIApplication.sharedApplication().keyWindow!.rootViewController!.presentViewController(vc, animated: true, completion: nil)
                    }
                    else
                    {
                        self.canRestart = true
                    }
0

All Articles