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

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

No se pudo encontrar una sobrecarga para ‘init’ que acepta los argumentos proporcionados

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

En este momento está fallando y parece que no puedo obtener la syntax correcta.

Desde la clase UIAlertView :

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

En iOS 8, puedes hacer esto:

 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) 

Ahora UIAlertController es una clase única para crear e interactuar con lo que conocemos como UIAlertView 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") } }})) 

Editar para 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) 

Editar para Swift 4:

 let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.alert) 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") }})) self.present(alert, animated: true, completion: nil) 

Un botón

Captura de pantalla de One 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) } } 

Dos botones

Captura de pantalla de Two Button Alert

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

Tres botones

enter image description here

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

Manejo de los botones del grifo

El handler era nil en los ejemplos anteriores. Puede reemplazar nil con un cierre para hacer algo cuando el usuario toca un botón. Por ejemplo:

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

Notas

  • No es necesario que los botones múltiples usen diferentes tipos de UIAlertActionStyle . Todos podrían ser .default .
  • Para más de tres botones, considere usar una Hoja de Acción. La configuración es muy similar. Aquí hay un ejemplo.

Puedes crear un UIAlert usando el constructor estándar, pero el ‘heredado’ 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", 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") })) } 

Hecho con dos botones Aceptar y cancelar

Si se dirige a iOS 7 y 8, necesita algo como esto para asegurarse de que está 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, 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() } } 

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

Muestra UIAlertViewController en un lenguaje rápido: –

 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) 

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 clase está obsoleta 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á.

Con las extensiones de protocolo de Swift 2, puede crear un protocolo que proporcione una implementación predeterminada para sus controladores 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, 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!") } } 

Encontré este,

 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 archivo de encabezado como:

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

alguien puede explicar esto.

Para SWIFT4 , creo que extender UIViewController y crear un control de confirmación reutilizable es la forma más elegante.

Puede extender UIViewController siguiente manera:

 extension UIViewController { func AskConfirmation (title:String, message:String, completion:@escaping (_ result:Bool) -> Void) { let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert) self.present(alert, animated: true, completion: nil) alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: { action in completion(true) })) alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { action in completion(false) })) } } 

Entonces puedes usarlo en cualquier momento:

  AskConfirmation(title: "YOUR MESSAGE TITLE", message: "YOUR MESSAGE") { (result) in if result { //User has clicked on Ok } else { //User has clicked on Cancel } } 
  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. Supongamos que tiene 5 clases donde se aplicará una alerta de desconexión. Pruebe con la extensión de clase rápida.

File- New- Swift class- Nómbrelo.

Agregue lo siguiente:

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

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

Creé una clase singleton para que sea conveniente utilizarla desde cualquier lugar de tu aplicación: https://github.com/Swinny1989/Swift-Popups

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

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

o ventanas emergentes con un solo botón como este:

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

Swift 3

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

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

En el ejemplo anterior, la callback de la acción se ha omitido porque el comportamiento predeterminado de una vista de alerta con un botón desaparecerá cuando se haga clic en el botón.

Aquí se muestra cómo crear otra acción, que podría agregarse a la alerta con “alert.addAction (action)”. Los diferentes estilos son .default, .destructive y .cancel.

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

UIAlertView el siguiente código de inicialización de UIAlertView para comstackr sin errores (creo que la última parte variable es difícil tal vez). Pero tenía que asegurarme de que la clase de self (que paso como delegado) estuviera adoptando el protocolo UIAlertViewDelegate para que UIAlertViewDelegate los errores de comstackción:

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

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

No se puede encontrar un inicializador para el tipo ‘UIAlertView’ que acepta una lista de argumentos de tipo ‘(título: Cadena, mensaje: Cadena, delegado: MyViewController, cancelButtonTitle: String, otherButtonTitles: String)’

Como otros mencionaron, debes migrar a UIAlertController si puedes apuntar a iOS 8.x +. Para admitir iOS 7, use el código anterior (iOS 6 no es compatible con Swift).

La razón por la que no funciona porque algún valor que pasó a la función no es correcto. swift no le gusta Objective-C, puede poner nil a los argumentos que son tipo de clase sin ninguna restricción (podría ser). El argumento otherButtonTitles se define como no opcional, y su tipo no tiene (?) Al final. por lo tanto, debe 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 una vista de alerta

  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) 

Referencia: Swift Show Alert usando UIAlertController

en 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) 
  let alertController = UIAlertController(title: "Select Photo", message: "Select atleast one photo", preferredStyle: .alert) let action1 = UIAlertAction(title: "From Photo", style: .default) { (action) in print("Default is pressed.....") } let action2 = UIAlertAction(title: "Cancel", style: .cancel) { (action) in print("Cancel is pressed......") } let action3 = UIAlertAction(title: "Click new", style: .default) { (action) in print("Destructive is pressed....") } alertController.addAction(action1) alertController.addAction(action2) alertController.addAction(action3) self.present(alertController, animated: true, completion: nil) } 

Aquí hay un ejemplo divertido en 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) } } 

Aquí hay una función 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 el mensaje como una Cadena donde usa esta función.

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.", 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) { // ... } 

en IOS 9, puedes hacer esto

 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) 

// Clase genérica para UIAlertView

 //MARK:- MODULES import Foundation import UIKit //MARK:- CLASS class Alert : NSObject{ static let shared = Alert() var okAction : AlertSuccess? typealias AlertSuccess = (()->())? var alert: UIAlertController? /** show */ public func show(title : String?, message : String?, viewController : UIViewController?, okAction : AlertSuccess = nil) { let version : NSString = UIDevice.current.systemVersion as NSString if version.doubleValue >= 8 { alert = UIAlertController(title: title, message: message, preferredStyle:.alert) alert?.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action: UIAlertAction) in if let okAction = okAction { okAction() } })) viewController?.present(alert ?? UIAlertController(), animated:true, completion:nil); } } /** showWithCancelAndOk */ public func showWithCancelAndOk(title : String, okTitle : String, cancelTitle : String, message : String, viewController : UIViewController?, okAction : AlertSuccess = nil, cancelAction : AlertSuccess = nil) { let version:NSString = UIDevice.current.systemVersion as NSString; if version.doubleValue >= 8 { alert = UIAlertController(title: title, message: message, preferredStyle:.alert) alert?.addAction(UIAlertAction(title: cancelTitle, style: .default, handler: { (action: UIAlertAction) in if let cancelAction = cancelAction { cancelAction() } })) alert?.addAction(UIAlertAction(title: okTitle, style: .default, handler: { (action: UIAlertAction) in if let okAction = okAction { okAction() } })) viewController?.present(alert!, animated:true, completion:nil); } } /** showWithTimer */ public func showWithTimer(message : String?, viewController : UIViewController?) { let version : NSString = UIDevice.current.systemVersion as NSString if version.doubleValue >= 8 { alert = UIAlertController(title: "", message: message, preferredStyle:.alert) viewController?.present(alert ?? UIAlertController(), animated:true, completion:nil) let when = DispatchTime.now() + 1 DispatchQueue.main.asyncAfter(deadline: when){ self.alert?.dismiss(animated: true, completion: nil) } } } } 

Utilizar:-

 Alert.shared.show(title: "No Internet Connection", message: "The internet connection appers to be offline.", viewController: self) //without ok action Alert.shared.show(title: "No Internet Connection", message: "The internet connection appers to be offline.", viewController: self, okAction: { //ok action }) // with ok action Alert.shared.show(title: "No Internet Connection", message: "The internet connection appers to be offline.", viewController: self, okAction: { //ok action }, cancelAction: { //cancel action }) //with cancel and ok action Alert.shared.showWithTimer(message : "This is an alert with timer", viewController : self) //with timer 
  // UIAlertView is deprecated. Use UIAlertController // title = title of the alert view. // message = Alert message you want to show. // By tap on "OK" , Alert view will dismiss. UIAlertView(title: "Alert", message: "Enter Message here.", delegate: nil, cancelButtonTitle: "OK").show() 

SWIFT 4: Simplemente cree una extensión para UIViewController de la siguiente manera:

  extension UIViewController{ func showSucsessAlert(withTitle title: String, andMessage message:String){ let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert) alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)) self.present(alert, animated: true, completion: nil) } } 

Ahora en su viewcontroller, llame directamente a la función anterior como si fuera proporcionada por UIViewController.

  yourViewController.showSucsessAlert(withTitle: "YourTitle", andMessage: "YourCustomTitle") 

prueba esto. Poner Código de Fuelle en el Botón.

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

A continuación se muestra el código reutilizable para la vista de alerta y la hoja de acción, solo escriba una línea para mostrar la alerta en cualquier lugar de la aplicación

 class AlertView{ static func show(title:String? = nil,message:String?,preferredStyle: UIAlertControllerStyle = .alert,buttons:[String] = ["Ok"],completionHandler:@escaping (String)->Void){ let alert = UIAlertController(title: title, message: message, preferredStyle: preferredStyle) for button in buttons{ var style = UIAlertActionStyle.default let buttonText = button.lowercased().replacingOccurrences(of: " ", with: "") if buttonText == "cancel"{ style = .cancel } let action = UIAlertAction(title: button, style: style) { (_) in completionHandler(button) } alert.addAction(action) } DispatchQueue.main.async { if let app = UIApplication.shared.delegate as? AppDelegate, let rootViewController = app.window?.rootViewController { rootViewController.present(alert, animated: true, completion: nil) } } } } 

Uso:

 class ViewController: UIViewController { override func viewWillAppear(_ animated: Bool) { AlertView.show(title: "Alert", message: "Are you sure ?", preferredStyle: .alert, buttons: ["Yes","No"]) { (button) in print(button) } } } 

En Swift 4.1 y Xcode 9.4.1

 let alert = UIAlertController(title: ""Your title, message: "Your message", preferredStyle: .alert) let ok = UIAlertAction(title: "OK", style: .default, handler: { action in }) alert.addAction(ok) let cancel = UIAlertAction(title: "Cancel", style: .default, handler: { action in }) alert.addAction(cancel) DispatchQueue.main.async(execute: { self.present(alert, animated: true) }) 

Si desea estilo de clase Compartida (Escribir una vez usar en todas partes)

 import UIKit class SharedClass: NSObject {//This is shared class static let sharedInstance = SharedClass() //Show alert func alert(view: UIViewController, title: String, message: String) { let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { action in }) alert.addAction(defaultAction) DispatchQueue.main.async(execute: { view.present(alert, animated: true) }) } private override init() { } } 

Ahora llame alerta como esta en cada artículo

 SharedClass.SharedInstance.alert(view: self, title: "Your title here", message: "Your message here") 

Si desea presentar una alerta en la parte superior de todas las vistas, use este código

 func alertWindow(title: String, message: String) { DispatchQueue.main.async(execute: { let alertWindow = UIWindow(frame: UIScreen.main.bounds) alertWindow.rootViewController = UIViewController() alertWindow.windowLevel = UIWindowLevelAlert + 1 let alert2 = UIAlertController(title: title, message: message, preferredStyle: .alert) let defaultAction2 = UIAlertAction(title: "OK", style: .default, handler: { action in }) alert2.addAction(defaultAction2) alertWindow.makeKeyAndVisible() alertWindow.rootViewController?.present(alert2, animated: true, completion: nil) }) } 

Llamada de función

 SharedClass.sharedInstance.alertWindow(title:"This your title", message:"This is your message")