如何从 SKScene 呈现 UIAlertController
How to present UIAlertController from SKScene
我在 Spritekit 中工作,我试图从我的 SKScene 中呈现一个 UIAlertController,但是我在做这件事时遇到了麻烦。我看过几个教程,但是 none 的 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 不应该是呈现 UIAlertController 的那个,而是一个 UIViewController,例如您的初始 GameViewController。当从 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];
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)
}
只需在创建场景时设置指向 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];
我在 Spritekit 中工作,我试图从我的 SKScene 中呈现一个 UIAlertController,但是我在做这件事时遇到了麻烦。我看过几个教程,但是 none 的 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 不应该是呈现 UIAlertController 的那个,而是一个 UIViewController,例如您的初始 GameViewController。当从 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];
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)
}
只需在创建场景时设置指向 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];