我将如何在Swift中创build一个UIAlertView?

我一直在努力在Swift中创build一个UIAlertView,但由于某种原因,我无法得到正确的声明,因为我得到这个错误:

无法find接受提供的参数的“init”的重载

这是我写的:

let button2Alert: UIAlertView = UIAlertView(title: "Title", message: "message", delegate: self, cancelButtonTitle: "Ok", otherButtonTitles: nil) 

然后调用它我正在使用:

 button2Alert.show() 

截至目前它正在崩溃,我似乎无法得到正确的语法。

UIAlertView类:

// UIAlertView已被弃用。 相反 ,使用UIAlertController和UIAlertControllerStyleAlert的preferredStyle

在iOS 8上,你可以这样做:

 let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.Alert) alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil)) self.presentViewController(alert, animated: true, completion: nil) 

现在UIAlertController是一个类,用于在iOS 8上创build和与我们所知的UIAlertViewUIActionSheet交互。

编辑:处理操作:

 alert.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { action in switch action.style{ case .Default: print("default") case .Cancel: print("cancel") case .Destructive: print("destructive") } })) 

编辑Swift 3:

 let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.alert) alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.default, handler: nil)) self.present(alert, animated: true, completion: nil) 

更新了Swift 3

一个button

一个按钮截图

 class ViewController: UIViewController { @IBAction func showAlertButtonTapped(_ sender: UIButton) { // create the alert let alert = UIAlertController(title: "My Title", message: "This is my message.", preferredStyle: UIAlertControllerStyle.alert) // add an action (button) alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)) // show the alert self.present(alert, animated: true, completion: nil) } } 

两个button

两个按钮警报截图

 class ViewController: UIViewController { @IBAction func showAlertButtonTapped(_ sender: UIButton) { // create the alert let alert = UIAlertController(title: "UIAlertController", message: "Would you like to continue learning how to use iOS alerts?", preferredStyle: UIAlertControllerStyle.alert) // add the actions (buttons) alert.addAction(UIAlertAction(title: "Continue", style: UIAlertActionStyle.default, handler: nil)) alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: nil)) // show the alert self.present(alert, animated: true, completion: nil) } } 

三个button

三个按钮提醒截图

 class ViewController: UIViewController { @IBAction func showAlertButtonTapped(_ sender: UIButton) { // create the alert let alert = UIAlertController(title: "Notice", message: "Lauching this missile will destroy the entire universe. Is this what you intended to do?", preferredStyle: UIAlertControllerStyle.alert) // add the actions (buttons) alert.addAction(UIAlertAction(title: "Remind Me Tomorrow", style: UIAlertActionStyle.default, handler: nil)) alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: nil)) alert.addAction(UIAlertAction(title: "Launch the Missile", style: UIAlertActionStyle.destructive, handler: nil)) // show the alert self.present(alert, animated: true, completion: nil) } } 

处理button水龙头

在上面的例子中, handlernil 。 当用户点击一个button时,你可以用闭包来replacenil 。 例如:

 alert.addAction(UIAlertAction(title: "Launch the Missile", style: UIAlertActionStyle.destructive, handler: { action in // do something like... self.launchMissile() })) 

笔记

  • 多个button不一定需要使用不同的UIAlertActionStyletypes。 他们都可以。 .default
  • 对于三个以上的button考虑使用一个操作表。 设置非常相似。 这是一个例子。

你可以使用标准的构造函数创build一个UIAlert,但是“遗留”似乎不起作用:

 let alert = UIAlertView() alert.title = "Alert" alert.message = "Here's a message" alert.addButtonWithTitle("Understood") alert.show() 

点击查看

 @IBAction func testClick(sender: UIButton) { var uiAlert = UIAlertController(title: "Title", message: "Message", preferredStyle: UIAlertControllerStyle.Alert) self.presentViewController(uiAlert, animated: true, completion: nil) uiAlert.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { action in println("Click of default button") })) uiAlert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: { action in println("Click of cancel button") })) } 

用两个button完成并取消

如果您的目标是iOS 7 8,则需要类似这样的内容来确保每个版本都使用正确的方法,因为UIAlertView在iOS 8中不推荐使用,但UIAlertController在iOS 7中不可用:

 func alert(title: String, message: String) { if let getModernAlert: AnyClass = NSClassFromString("UIAlertController") { // iOS 8 let myAlert: UIAlertController = UIAlertController(title: title, message: message, preferredStyle: .Alert) myAlert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) self.presentViewController(myAlert, animated: true, completion: nil) } else { // iOS 7 let alert: UIAlertView = UIAlertView() alert.delegate = self alert.title = title alert.message = message alert.addButtonWithTitle("OK") alert.show() } } 

以swift语言显示UIAlertView: –

协议UIAlertViewDelegate

 let alert = UIAlertView(title: "alertView", message: "This is alertView", delegate:self, cancelButtonTitle:"Cancel", otherButtonTitles: "Done", "Delete") alert.show() 

以swift语言显示UIAlertViewController: –

 let alert = UIAlertController(title: "Error", message: "Enter data in Text fields", preferredStyle: UIAlertControllerStyle.Alert) alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil)) self.presentViewController(alert, animated: true, completion: nil) 

只是不要在构造函数中提供otherButtonTitles。

 let alertView = UIAlertView(title: "Oops!", message: "Something happened...", delegate: nil, cancelButtonTitle: "OK") alertView.show() 

但是我同意奥斯卡,这个类在iOS 8中已经被弃用了,所以如果你正在做一个iOS 8的应用程序,就不会有UIAlertView的使用。 否则上面的代码将工作。

使用Swift 2的协议扩展,您可以创build一个协议,为您的视图控制器提供默认实现:

ShowsAlert.swift

 import UIKit protocol ShowsAlert {} extension ShowsAlert where Self: UIViewController { func showAlert(title: String = "Error", message: String) { let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert) alertController.addAction(UIAlertAction(title: "Ok", style: .Default, handler: nil)) presentViewController(alertController, animated: true, completion: nil) } } 

ViewController.swift

 class ViewController: UIViewController, ShowsAlert { override func viewDidLoad() { super.viewDidLoad() showAlert(message: "Hey there, I am an error message!") } } 

我发现这一个,

 var alertView = UIAlertView(); alertView.addButtonWithTitle("Ok"); alertView.title = "title"; alertView.message = "message"; alertView.show(); 

虽然不好,但它的工作:)

更新:

但是我已经在头文件中find了:

 extension UIAlertView { convenience init(title: String, message: String, delegate: UIAlertViewDelegate?, cancelButtonTitle: String?, otherButtonTitles firstButtonTitle: String, _ moreButtonTitles: String...) } 

有人可以解释这一点。

  class Preview: UIViewController , UIAlertViewDelegate { @IBAction func MoreBtnClicked(sender: AnyObject) { var moreAlert=UIAlertView(title: "Photo", message: "", delegate: self, cancelButtonTitle: "No Thanks!", otherButtonTitles: "Save Image", "Email", "Facebook", "Whatsapp" ) moreAlert.show() moreAlert.tag=111; } func alertView(alertView: UIAlertView, didDismissWithButtonIndex buttonIndex: Int) { if alertView.tag==111 { if buttonIndex==0 { println("No Thanks!") } else if buttonIndex==1 { println("Save Image") } else if buttonIndex == 2 { println("Email") } else if buttonIndex == 3 { println("Facebook") } else if buttonIndex == 4 { println("Whatsapp") } } } } 

我有另一个窍门。 假设你有5个类,其中应用了注销警报。 尝试快速类扩展。

文件 – 新 – Swift类 – 命名它。

添加以下内容:

 public extension UIViewController { func makeLogOutAlert() { var refreshAlert = UIAlertController(title: "Log Out", message: "Are You Sure to Log Out ? ", preferredStyle: UIAlertControllerStyle.Alert) refreshAlert.addAction(UIAlertAction(title: "Confirm", style: .Default, handler: { (action: UIAlertAction!) in self.navigationController?.popToRootViewControllerAnimated(true) })) refreshAlert.addAction(UIAlertAction(title: "Cancel", style: .Default, handler: { (action: UIAlertAction!) in refreshAlert .dismissViewControllerAnimated(true, completion: nil) })) presentViewController(refreshAlert, animated: true, completion: nil) } } 

实现使用:self.makeLogOutAlert()。 希望它有帮助。

Swift 3

以下是如何使用Swift 3创build一个简单的警报的简单示例。

 let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Ok", style: .default)) present(alert, animated: true) 

在上面的例子中,动作的句柄callback已被省略,因为单击button时,具有一个button的警报视图的默认行为将消失。

以下是如何创build另一个操作,可以通过“alert.addAction(action)”添加到警报中。 不同的风格是.default,.destructive和.cancel。

 let action = UIAlertAction(title: "Ok", style: .default) { action in // Handle when button is clicked } 

我得到了下面的UIAlertView初始化代码来编译没有错误(我最后,不同的部分可能是棘手)。 但是我必须确定自己的类(我作为委托传递)采用UIAlertViewDelegate协议来编译错误消失:

 let alertView = UIAlertView( title: "My Title", message: "My Message", delegate: self, cancelButtonTitle: "Cancel", otherButtonTitles: "OK" ) 

顺便说一句,这是我得到的错误(从Xcode 6.4):

找不到types为“UIAlertView”的初始化工具,它接受types为“(title:String,message:String,delegate:MyViewController,cancelButtonTitle:String,otherButtonTitles:String)”的参数列表

正如其他人所提到的,如果你的目标是iOS 8.x +,你应该迁移到UIAlertController。 要支持iOS 7,请使用上面的代码(Swift不支持iOS 6)。

我已经做了一个单身人士课程,以方便您在应用程序的任何地方使用: https : //github.com/Swinny1989/Swift-Popups

然后,您可以创build一个popup式多个button,如下所示:

 Popups.SharedInstance.ShowAlert(self, title: "Title goes here", message: "Messages goes here", buttons: ["button one" , "button two"]) { (buttonPressed) -> Void in if buttonPressed == "button one" { //Code here } else if buttonPressed == "button two" { // Code here } } 

或popup一个单一的button,如下所示:

 Popups.SharedInstance.ShowPopup("Title goes here", message: "Message goes here.") 

它不工作的原因,因为你传递给函数的一些值是不正确的。 swift不喜欢Objective-C,你可以把nil作为没有任何限制的类types的参数(可能是)。 参数otherButtonTitles被定义为它的types在其末尾没有(?)的非可选项。 所以你必须传递一个具体的价值。

 @IBAction func Alert(sender: UIButton) { var alertView:UIAlertView = UIAlertView() alertView.title = "Alert!" alertView.message = "Message" alertView.delegate = self alertView.addButtonWithTitle("OK") alertView.show() } 

尝试这个

使用此代码显示一个alertview

  let alertController = UIAlertController(title: "Hello Coders", message: "your alert message", preferredStyle: .Alert) let defaultAction = UIAlertAction(title: "Close Alert", style: .Default, handler: nil) alertController.addAction(defaultAction) presentViewController(alertController, animated: true, completion: nil) 

参考: 使用UIAlertController的Swift Show Alert

Swift中有一个有趣的例子:

 private func presentRandomJoke() { if let randomJoke: String = jokesController.randomJoke() { let alertController: UIAlertController = UIAlertController(title:nil, message:randomJoke, preferredStyle: UIAlertControllerStyle.Alert) alertController.addAction(UIAlertAction(title:"Done", style:UIAlertActionStyle.Default, handler:nil)) presentViewController(alertController, animated:true, completion:nil) } } 

这是Swift中一个非常简单的AlertView函数:

 class func globalAlertYesNo(msg: String) { let alertView = UNAlertView(title: "Title", message: msg) alertView.messageAlignment = NSTextAlignment.Center alertView.buttonAlignment = UNButtonAlignment.Horizontal alertView.addButton("Yes", action: { print("Yes action") }) alertView.addButton("No", action: { print("No action") }) alertView.show() } 

您必须在使用此function的地方将消息作为string传递。

旧方法:UIAlertView

 let alertView = UIAlertView(title: "Default Style", message: "A standard alert.", delegate: self, cancelButtonTitle: "Cancel", otherButtonTitles: "OK") alertView.alertViewStyle = .Default alertView.show() // MARK: UIAlertViewDelegate func alertView(alertView: UIAlertView, clickedButtonAtIndex buttonIndex: Int) { switch buttonIndex { // ... } } 

新方法:UIAlertController

 let alertController = UIAlertController(title: "Default Style", message: "A standard alert.", preferredStyle: .Alert) let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) { (action) in // ... } alertController.addAction(cancelAction) let OKAction = UIAlertAction(title: "OK", style: .Default) { (action) in // ... } alertController.addAction(OKAction) self.presentViewController(alertController, animated: true) { // ... } 

在xcode 9

 let alert = UIAlertController(title: "Alert", message: "message", preferredStyle: UIAlertControllerStyle.alert) alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil)) self.present(alert, animated: true, completion: nil)