2015-12-19 142 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() 

但這現在貶值在IOS 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應用的答案,因爲這將導致超過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!. 

,當您需要您的視圖控制器訪問。

這些方法都有優點和缺點,所以選擇最適合您的方式。

+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的答案很好,但我認爲它有點長。 我只是在這裏提供另一個解決方案,使用Cocoapoad的Podfile for new comers(其他人有同樣的問題)。

  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() 
        } 
    } 
    

您可以添加標題許多按鈕,如果你想要的,做你想做的任何行動。在這裏,我只是打印「確定被推送」。

上述引用鏈接加上this one幫助我在多級遊戲中輕鬆理解和使用此UIAlertView,以在遊戲的「暫停」按鈕上顯示警報。

相關問題