2015-12-19 3 views
2

Простой способ отображения UIAlertView в Свифт:Показ UIAlertController в GameScene (SpriteKit/Swift)

let alert = UIAlertView() 
alert.title = "Alert!" 
alert.message = "A wise message" 
alert.addButtonWithTitle("Ok, thank you") 
alert.show() 

Но теперь амортизируется прошивкой 9 и рекомендует использовать UIAlertController:

let myAlert: UIAlertController = UIAlertController(title: "Alert!", message: "Oh! Fancy", preferredStyle: .Alert) 
myAlert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) 
self.presentViewController(myAlert, animated: true, completion: nil) 

это здорово, но я использую SpriteKit и внутри GameScene, что дает ошибку Value of type 'GameScene' has no member 'presentViewController' ...

нужно ли мне вернуться к моей ViewController представить это или есть способ назвать это из GameScene.

Я нашел THIS ответ, но это Objective-C.

ответ

7

Есть много способов справиться с этой ситуацией, я не рекомендую Jozemite Apps ответ, потому что это может вызвать проблемы в приложениях с более чем 1 вид контроллера. (Вы хотите, чтобы представить уведомление о текущем контроллере представления , а не корень)

Мой предпочтительный способ сделать это через делегирование. Что нужно сделать, это создать протокол для обработки сообщений:

import Foundation 
protocol ViewControllerDelegate 
{ 
    func sendMessage(message:String); 
} 

В контроллере представления:

class ViewController : UIViewController, ViewControllerDelegate 
{ 
    ... 
    func sendMessage(message:String) 
    { 
     //do alert view code here 
    } 

    //in the view controllers view did load event 
    func viewDidLoad() 
    { 
     var view = self.view as! GameSceneView 
     view.delegate = self 
    } 

В коде вида:

var delegate : ViewControllerDelegate 

Наконец, в сцене игры где вы хотите представить:

self.view.delegate?.sendMessage(message) 

Этот способ обеспечивает ограниченный доступ к VC и может быть изменен с дополнительными параметрами, когда это необходимо.

Другой способ - создать систему уведомлений и использовать NSNotificationCenter для передачи сообщения от сцены к текущему VC и отправить сообщение;

в ViewController

func viewDidLoad() 
{ 
    NSNotificationCenter.defaultCenter().addObserver(self,selector:"AlertMessage:",name:"AlertMessage",object:nil); 

} 

func AlertMessage(notification:NSNotification) 
{ 
    if(let userInfo = notification.userInfo) 
    { 
     let message = userInfo["message"] 
     ....//do alert view call here 
    } 
} 

В коде сцены игры:

...at the spot you want to send a message 
let userInfo = ["message":message]; 
NSNotificationCenter.defaultCenter.postNotificationNamed("AlertMessage",object:nil,userInfo:userInfo) 

Другой подход заключается в сохранении указателя вида контроллера к игровому виду сцены:

//in Game Scene View code 
var viewController : UIViewController; 

//in the view controllers view did load event 
func viewDidLoad() 
{ 
    var view = self.view as! GameSceneView 
    view.viewController = self 
} 

//finally in game scene where you want to present 
let myAlert: UIAlertController = UIAlertController(title: "Alert!", message: "Oh! Fancy", preferredStyle: .Alert) 
myAlert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) 
self.view.viewController.presentViewController(myAlert, animated: true, completion: nil) 

Еще один способ чтобы сделать ваш контроллер просмотра глобальным.

В видовом код контроллера: частный вар _instance: UIViewController

class ViewController : UIViewController 
{ 
    class var instance 
    { 
     get 
     { 
      return _instance; 
     } 
    } 

    func viewDidLoad() 
    { 
     _instance = self; 
    } 
} 

Тогда просто позвоните

ViewController.instance!. 

всякий раз, когда вам нужно получить доступ к контроллеру представления.

У каждого из этих методов есть сильные и слабые стороны, поэтому выберите любой способ, который лучше всего подходит для вас.

+0

Вау, удивительный ответ. С нетерпением ждем попыток: D – Reanimation

3

Попробуйте использовать это. Я работаю в SpriteKit, и я использовал этот код для своих сообщений о покупке приложений в своей игре Chomp'd.

self.view?.window?.rootViewController?.presentViewController(myAlert, animated: true, completion: nil) 
+1

К сожалению, этот метод будет работать только в том случае, если контроллер корневого представления является активным контроллером представления. Если у вас несколько контроллеров просмотра, это может привести к проблемам. – Knight0fDragon

+0

Ответ KnightOfDragon очень хорош и выделяет кучу точек, которые действительно удобны. Но приятно видеть этот маленький метод, должен ли я иметь только 1 viewController :) – Reanimation

+0

Я не знал об этом, что вызывало проблемы, так как мне когда-либо понадобилось только 1 контроллер просмотра и многократные сцены. –

1

Ответ от @ Knight0fDragon хороший, но я думаю, что он немного длинный. Я просто поставлю здесь другое решение, используя Podfile of Cocoapoad для новых пользователей (другие ребята имеют такую ​​же проблему).

  1. сначала нужно установить cocoapod и инициировать его для вашего проекта (очень легко сделать, проверить некоторые YouTube видео или this link

  2. в вашей полученной Podfile, копировать и вставить этот: pod 'SIAlertView'.. это «замена UIAlertView с блоком синтаксисом и причудливыми стилями перехода». (Более подробно here. Пожалуйста, дайте кредит в библиотеках авторов, которые вы используете.

  3. Наконец, в файл GameScene.swift добавить следующее после импорт или после он закрывающая скобка класса GameScene

    private extension GameScene { 
        func showPauseAlert() { 
         let alertView = SIAlertView(title: "Edess!!", andMessage: "Congratulations! test testing bla bla bla") 
    
         alertView.addButtonWithTitle("OK", type: .Default) { (alertView) -> Void in 
          print("ok was pushed") 
         } 
    
         alertView.show() 
        } 
    } 
    

Вы можете добавить много кнопку с названием, если вы хотите, и делать любые действия, которые вы хотите. Здесь я просто печатаю «Ok был нажат».

Приведенные выше ссылки плюс this one помогли мне легко понять и работать с этим UIAlertView в моей многоуровневой игре, чтобы отобразить предупреждение о кнопке «Пауза» в игре.

Смежные вопросы