如何从SKScene展示UIAlertController

我在Spritekit工作,我试图从我的SKScene提出一个UIAlertController,但我遇到麻烦。 我看过几个教程,但是没有一个UIAlertController教程是专门针对Spritekit的。 我不断地看到下面的代码,但它并没有效果,因为SKScene不是一个UIViewController。

[self presentViewController:self animated:YES completion:nil]; 

我有下面的相关代码的其余部分。 任何人都可以帮我在我的SKScene上展示我的UIAlerController。

 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"You Lose!" message:@"Do You Want To Beat This Level?" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *CancelButton = [UIAlertAction actionWithTitle:@"GiveUp" style:UIAlertControllerStyleAlert handler:<#^(UIAlertAction *action)handler#>] 

SKScene实例不能调用presentViewController(_:animated:completion)因为它不是UIViewController的子类。 但是,如果您重写的话,您的警报将启动:

 self.view?.window?.rootViewController?.presentViewController(alert, animated: true, completion: nil) 

ps:会出现一个警告, Attempt to present <UIAlertController: 0x7fc31eb32e50> on <Sample_Game.GameViewController: 0x7fc31bd9b4f0> which is already presenting 。 如果有人知道如何消除这个警告,这将是伟大的。


[2016年8月11日更新]

要消除上述警告,请检查rootViewController是否提供了一个视图控制器:

  let vc = self.view?.window?.rootViewController if vc.presentedViewController == nil { vc.presentViewController(alert, animated: true, completion: nil) } 

SKScene不应该是提供UIAlertController的人,而应该是像你最初的GameViewController这样的UIViewController。 上面的代码从UIViewController调用时工作正常。

你可以使用NSNotificationCenter来帮助你调用你的视图控制器。

将此添加到您的视图控制器的viewDidLoad方法,

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerLost:) name:@"PlayerLostNotification" object:nil]; 

你也需要定义这个方法。

 - (void)playerLost:(NSNotification*) notification { UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"You Lose!" message:@"Do You Want To Beat This Level?" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction* cancel = [UIAlertAction actionWithTitle:@"GiveUp" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { [alert dismissViewControllerAnimated:YES completion:nil]; }]; [alert addAction:cancel]; [self presentViewController:alert animated:YES completion:nil]; } 

在玩家丢失的SKScene中,

 [[NSNotificationCenter defaultCenter] postNotificationName:@"PlayerLostNotification" object:self]; 

创build场景时,只需设置一个指向viewController的指针即可。 然后你可以这样调用它:[self.viewController presentViewController:alert animated:YES completion:nil];

在你的ViewController中:

 // Create and configure the scene. GameScene *scene = [GameScene sceneWithSize:viewSize]; SKView * skView = (SKView *)self.view; scene.viewController = self; // Present the scene. [skView presentScene:scene];