¿Cómo crearía un UIAlertView en Swift?

He estado trabajando para crear un UIAlertView en Swift, pero por alguna razón no puedo get la statement correcta porque obtengo este error:

No se pudo encontrar una sobrecarga para 'init' que acepte los arguments suministrados.

Así es como lo tengo escrito:

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

Entonces para llamarlo estoy usando:

 button2Alert.show() 

A partir de ahora está fallando y parece que no puedo conseguir la syntax correcta.

Desde la class UIAlertView :

// UIAlertView está en desuso. Utilice UIAlertController con un estilo preferido de UIAlertControllerStyleAlert

En iOS 8, puede hacer esto:

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

Ahora UIAlertController es una class única para crear e interactuar con lo que conocíamos como UIAlertView s y UIActionSheet s en iOS 8.

Editar: para manejar acciones:

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

Edit para Swift 3:

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

Actualizado para Swift 3

Un button

Captura de pantalla de un botón

 class ViewController: UIViewController { @IBAction func showAlertButtonTapped(_ sender: UIButton) { // create the alert let alert = UIAlertController(title: "My Title", message: "This is my message.", prefernetworkingStyle: 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) } } 

Dos botones

Captura de pantalla de alerta de dos botones

 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?", prefernetworkingStyle: 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) } } 

Tres botones

Pantalla de alerta de tres botones

 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?", prefernetworkingStyle: 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) } } 

Manejo de pulsadores de button

El handler fue nil en los ejemplos anteriores. Puede replace nil con un cierre para hacer algo cuando el usuario presiona un button. Por ejemplo:

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

Notas

  • Múltiples botones no necesariamente necesitan usar diferentes types de UIAlertActionStyle . Todos podrían ser .default .
  • Para más de tres botones, considere usar una hoja de acción. La configuration es muy similar. Aquí hay un ejemplo.

Puede crear un UIAlert utilizando el constructor estándar, pero el 'henetworkingado' parece no funcionar:

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

Click de vista

 @IBAction func testClick(sender: UIButton) { var uiAlert = UIAlertController(title: "Title", message: "Message", prefernetworkingStyle: 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") })) } 

Hecho con dos botones, Aceptar y Cancelar.

Si estás orientado a iOS 7 y 8, necesitas algo como esto para asegurarte de que estás utilizando el método correcto para cada versión, porque UIAlertView está en desuso en iOS 8, pero UIAlertController no está disponible en iOS 7:

 func alert(title: String, message: String) { if let getModernAlert: AnyClass = NSClassFromString("UIAlertController") { // iOS 8 let myAlert: UIAlertController = UIAlertController(title: title, message: message, prefernetworkingStyle: .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() } } 

Simplemente no proporcione otherButtonTitles en el constructor.

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

Pero estoy de acuerdo con Oscar, esta class está en desuso en iOS 8, por lo que no habrá ningún uso de UIAlertView si estás haciendo una aplicación iOS 8 solamente. De lo contrario, el código anterior funcionará.

Mostrar UIAlertView en un lenguaje rápido: –

Protocolo UIAlertViewDelegate

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

Mostrar UIAlertViewController en un lenguaje rápido:

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

Encontré esta,

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

No es bueno, pero funciona 🙂

Actualizar:

pero he encontrado en el file de encabezado como:

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

alguien puede explicar esto

Con las extensiones de protocolo de Swift 2, puede hacer un protocolo que proporcione una implementación pnetworkingeterminada a sus controlleres de vista:

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, prefernetworkingStyle: .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!") } } 
  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") } } } } 

Tengo otro truco Suponga que tiene 5 classs en las que se aplicará una alerta de cierre de session. Intente con la extensión de class rápida.

Archivo- Nueva- Clase Swift- Nómbrelo.

Agregue lo siguiente:

 public extension UIViewController { func makeLogOutAlert() { var refreshAlert = UIAlertController(title: "Log Out", message: "Are You Sure to Log Out ? ", prefernetworkingStyle: 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) } } 

Implementar usando: self.makeLogOutAlert (). Espero eso ayude.

Swift 3

El siguiente es un ejemplo simple de cómo crear una alerta simple con un button con Swift 3.

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

En el ejemplo anterior, se ha omitido la callback de la acción porque el comportamiento pnetworkingeterminado de una vista de alerta con un button desaparece cuando se hace clic en el button.

A continuación, se describe cómo crear otra acción, que podría agregarse a la alerta con "alert.addAction (acción)". Los diferentes styles son .default, .destructive y .cancel.

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

Recibí el siguiente código de initialization UIAlertView para comstackr sin errores (creo que la última, la parte variable es complicada quizás). Pero tuve que asegurarme de que la class de self (que estoy pasando como delegado) adoptaba el protocolo UIAlertViewDelegate para que los errores de compilation desaparezcan:

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

Por cierto, este es el error que obtuve (a partir de Xcode 6.4):

No se puede encontrar un inicializador para el tipo 'UIAlertView' que acepte una list de arguments de tipo '(title: String, message: String, delegate: MyViewController, cancelButtonTitle: String, otherButtonTitles: String)'

Como otros mencionaron, debería migrar a UIAlertController si puede orientar iOS 8.x +. Para admitir iOS 7, usa el código anterior (iOS 6 no es compatible con Swift).

Hice una class singleton para que sea conveniente usar desde cualquier lugar de su aplicación: https://github.com/Swinny1989/Swift-Popups

A continuación, puede crear una window emergente con varios botones como este:

 Popups.ShanetworkingInstance.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 } } 

o windows emergentes con un solo button como este:

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

La razón por la que no funciona porque algún valor que pasó a la function no es correcta. A Swift no le gusta Objective-C, puede poner nil a arguments que son de tipo class sin ninguna restricción (podría ser). Argumento otherButtonTitles se define como no opcional y su tipo no tiene (?) En su final. así que debes transmitirle un valor concreto.

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

Prueba esto

Use este código para mostrar un alerta

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

Referencia: Swift Show Alert utilizando UIAlertController

Aquí hay un ejemplo divertido en Swift:

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

Aquí hay una function bastante simple de AlertView en Swift:

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

Tiene que pasar un post como una cadena en la que usa esta function.

The Old Way: 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 { // ... } } 

La nueva forma: UIAlertController

 let alertController = UIAlertController(title: "Default Style", message: "A standard alert.", prefernetworkingStyle: .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) { // ... } 

en xcode 9

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