【问题标题】:SKScene LeaderboardsSKScene 排行榜
【发布时间】:2014-12-14 10:18:22
【问题描述】:

我有一个按以下方式组织的游戏:

  1. 一个菜单 (ViewController) - 在 Storyboard 中制作 - 我在其中向游戏中心验证玩家身份并提供一个前往排行榜的按钮(效果很好)

  2. 制作 SKScene 的视图控制器,用于启动游戏 (GameScene)

  3. 一个名为 GameOverScene 的 SKscene 会在游戏失败时出现。

我想在 GameOverScene 上有一个按钮来带我进入排行榜

这是我在 GameOverScene 中用于显示排行榜的代码:

-(void)showLeaderboardAndAchievements:(BOOL)shouldShowLeaderboard{
GKGameCenterViewController *gcViewController = [[GKGameCenterViewController alloc] init];

gcViewController.gameCenterDelegate = self;

if (shouldShowLeaderboard) {
    gcViewController.viewState = GKGameCenterViewControllerStateLeaderboards;
    gcViewController.leaderboardIdentifier = @"wurst.highscore";
}
else{
    gcViewController.viewState = GKGameCenterViewControllerStateAchievements;
}
UIViewController *vc = self.view.window.rootViewController;
[vc presentViewController:gcViewController animated:YES completion:nil];

}

当相应的按钮被触摸并且没有任何反应时,我运行这段代码:我收到一个日志错误或警告说:

" 警告:尝试呈现不在窗口层次结构中的视图!"

为什么它试图在 MenuViewController 上而不是在 GameViewController 上呈现它(这是 SKScenes 发生的视图控制器?

非常感谢您的帮助

【问题讨论】:

    标签: ios objective-c viewcontroller


    【解决方案1】:

    在您的情况下,您的视图的视图控制器和当前窗口的控制器之间存在差异。我认为使用从场景到视图控制器的委托方法来实现这一点是一个更好的主意。让视图控制器的代码呈现排行榜。

    【讨论】:

    • 很抱歉,我该怎么做?
    • 看看网上的一些教程,this one for example
    • 所以你是说我应该在 GameViewController 中添加 showleaderboard 函数并让 gameOverScene 中的按钮告诉它通过委托运行?
    • 是的,没错。这也是视图控制器代码更合乎逻辑的地方。