【问题标题】:Attempt to present GKGameCenterViewController on UIViewController whose view is not in the window hierarchy尝试在视图不在窗口层次结构中的 UIViewController 上呈现 GKGameCenterViewController
【发布时间】:2015-04-27 11:37:44
【问题描述】:

当用户按下我的 SecondViewController 上的按钮(带有得分/最高得分的游戏结束屏幕)时,我无法显示 Game Center 排行榜。 UIbutton 是 ShowLeaderboard,您将在下面看到。

我得到的错误是:

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

我尝试过先关闭视图,但无论我做什么,我都不能只显示排行榜视图。下面是我的 SecondViewController 代码:

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)
}
}

编辑 搞定了!我所要做的就是改变

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

var vc = self

【问题讨论】:

    标签: ios objective-c swift uiviewcontroller


    【解决方案1】:
    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
                        }
    

    【讨论】:

      【解决方案2】:

      您可能会看到此警告,因为您在 dismissViewControllerAnimated 完成动画之前显示排行榜。您应该将showLeader() 放在dismissViewControllerAnimated 的完成参数中。

      【讨论】:

      • 嗯,即使我执行 `gameCenterViewController.dismissViewControllerAnimated(true, completion: {self.showLeader()})`,它仍然给我同样的错误
      • 您是否要关闭 SecondViewController,然后尝试显示排行榜?
      • 我用上面的代码试过了,除非我做错了?
      • 您应该从显示 SecondViewController 的控制器中显示排行榜。
      猜你喜欢
      • 2012-08-05
      • 2016-01-06
      • 2016-03-26
      • 2017-04-01
      • 1970-01-01
      相关资源
      最近更新 更多