2

Я работаю в Spritekit, и я пытаюсь представить UIAlertController из моего SKScene, но у меня возникают проблемы с этим. Я просмотрел несколько руководств, но ни один из учебных пособий UIAlertController не был специфичным для Spritekit. Я продолжаю видеть этот код ниже, но он не был эффективен, поскольку SKScene не является UIViewController.Как представить UIAlertController из SKScene

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

У меня есть остальная часть относительного кода ниже. Кто-нибудь может помочь мне представить мой UIAlerController на моем SKScene.

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#>] 

ответ

0

Экземпляр SKScene не может ссылаться на presentViewController(_:animated:completion), потому что это не подкласс UIViewController. Тем не менее, если вы переписать как таковой, ваше предупреждение запустит:

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

пс: там будет предупреждение, хотя этот Attempt to present <UIAlertController: 0x7fc31eb32e50> on <Sample_Game.GameViewController: 0x7fc31bd9b4f0> which is already presenting. Если кто-нибудь знает, как искоренить это предупреждение, это будет здорово.


[Обновлен 11 августа 2016]

Искоренить вышеупомянутое предупреждение, проверьте, если RootViewController представила контроллер представления:

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

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]; 
+0

Но в контексте моей игры, когда игрок проигрывает, я использую UIAlertController, чтобы дать пользователю возможность снова играть уровень или отказаться и перейти к меню (Ранее я использовал UIAlertView). Как я могу выполнить это из SKScene? – John

+0

Право на. По существу вам нужно будет отправить сообщение обратно в контроллер просмотра. Вы можете сохранить ссылку на контроллер вида в SKScene, сделать делегат или использовать NSNotificationCenter. По сути, вы хотите вызвать контроллер вида, когда пришло время показать предупреждение. – omygaudio

+0

Не могли бы вы привести пример в коде того, как я это сделаю? – John

0

Просто установите указатель на свой ViewController при создании вашей сцены. Затем вы можете назвать это следующим образом: [self.viewController presentViewController: alert анимированный: ДА завершение: ноль];

В вашем 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];