在swift中显示UIAlertView的简单方法是:
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。
答案 0 :(得分:8)
有很多方法可以处理这种情况,我不建议使用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)
另一种方法是让你的视图控制器全局化。
在视图控制器代码中: private var _instance:UIViewController
class ViewController : UIViewController
{
class var instance
{
get
{
return _instance;
}
}
func viewDidLoad()
{
_instance = self;
}
}
然后致电
ViewController.instance!.
每当您需要访问视图控制器时。
这些方法都有优点和缺点,所以选择最适合你的方式。
答案 1 :(得分:3)
尝试使用此功能。我在SpriteKit工作,我在我的游戏中使用这个代码购买消息,Chomp' d。
self.view?.window?.rootViewController?.presentViewController(myAlert, animated: true, completion: nil)
答案 2 :(得分:1)
来自@ Knight0fDragon的答案很好,但我觉得它有点长。 我将在这里使用Cocoapoad的Podfile为新来者提供另一个解决方案(其他人有同样的问题)。
首先您需要安装cocoapod并为您的项目启动它(非常容易;查看一些YouTube视频或this link。
,复制并粘贴它:pod 'SIAlertView'
。它是“使用块语法和花哨过渡样式替换UIAlertView”。 (更多详情here。请赞扬您正在使用的图书馆作者。
最后,在您的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,在游戏的“暂停”按钮上显示警告。