Есть много способов справиться с этой ситуацией, я не рекомендую 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!.
всякий раз, когда вам нужно получить доступ к контроллеру представления.
У каждого из этих методов есть сильные и слабые стороны, поэтому выберите любой способ, который лучше всего подходит для вас.
Вау, удивительный ответ. С нетерпением ждем попыток: D – Reanimation