有許多方法來處理這種情況下,我不建議Jozemite應用的答案,因爲這將導致超過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併發送消息;
在視圖控制器
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)
還有一種方法是使您的視圖控制器全局。
在視圖控制器代碼: 私人VAR _instance:UIViewController中
class ViewController : UIViewController
{
class var instance
{
get
{
return _instance;
}
}
func viewDidLoad()
{
_instance = self;
}
}
然後就叫
ViewController.instance!.
,當您需要您的視圖控制器訪問。
這些方法都有優點和缺點,所以選擇最適合您的方式。
哇,真棒答案。期待嘗試這些:D – Reanimation