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

481

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

No se pudo encontrar una sobrecarga para 'init' que acepte 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()

A partir de ahora está fallando y parece que no puedo entender bien la sintaxis.

Oso azul
fuente
55
UIAlertViewy UIActionSheetha sido reemplazado por UIAlertControlleren iOS 8, ¿has mirado esto?
Popeye
Asegúrese de que la clase a la que selfpertenece adopta el protocolo UIAlertViewDelegate(la forma recomendada de hacerlo, en Swift, es con una extensión).
Nicolas Miari
@ Adam: he revertido tu re-etiquetado. La etiqueta swift3 es para "preguntas directamente relacionadas con los cambios en la versión 3 del lenguaje de programación Swift de Apple". Y no creo que "si las respuestas dejan claro que el problema en la pregunta fue causado por algo diferente a lo que el autor de la pregunta pensaba, volver a marcar es muy útil". de meta.stackoverflow.com/questions/252079/… se aplica aquí.
Martin R
1
@MartinR No sé cómo se pueden actualizar las preguntas para mostrar que hay respuestas que se aplican a una versión actual de Swift; hay muchas cosas viejas e inútiles aquí y [rápido] lo encuentra todo junto con lo útil. No creo que este cambio sea revertido, pero desearía que hubiera una forma definitiva de resolver este problema. (Deseo que las respuestas tengan etiquetas.)
Adam Eberbach

Respuestas:

897

De la UIAlertViewclase:

// UIAlertView está en desuso. Utilice UIAlertController con un PreferredStyle 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 UIAlertControlleres una clase única para crear e interactuar con lo que sabíamos como UIAlertViewsy UIActionSheets 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.x:

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: .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)
Oscar Swanros
fuente
3
¿Dónde viste que UIAlertView está en desuso? ¿No veo eso en la documentación?
BlueBear
99
Cmd + Haga clic en la UIAlertViewclase, y el comentario está justo encima de la declaración de la clase.
Oscar Swanros
2
Contestaré mi propia pregunta para cualquier persona que tenga curiosidad alert.addAction (UIAlertAction (título: "Cancelar", estilo: UIAlertActionStyle.Cancel, handler: {(ACTION: UIAlertAction!) En}))
altyus
55
¿Cuál es el punto de cancelar y casos destructivos ya que siempre será lo que especificó .Default?
Usuario
44
Leer esta respuesta, el caso de cambio que hizo es innecesario . El interruptor solo es útil si el tipo o el título no están codificados, es decir, son dinámicos: es posible que tenga una serie de botones dinámicos para que los títulos no estén codificados. Y luego el controlador podría necesitar pasar el título elegido a otra llamada a otro método
Honey
465

Un botón

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.", preferredStyle: UIAlertController.Style.alert)

        // add an action (button)
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.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?", preferredStyle: UIAlertController.Style.alert)

        // add the actions (buttons)
        alert.addAction(UIAlertAction(title: "Continue", style: UIAlertAction.Style.default, handler: nil))
        alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel, handler: nil))

        // show the alert
        self.present(alert, animated: true, completion: nil)
    }
}

Tres botones

ingrese la descripción de la imagen aquí

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: UIAlertController.Style.alert)

        // add the actions (buttons)
        alert.addAction(UIAlertAction(title: "Remind Me Tomorrow", style: UIAlertAction.Style.default, handler: nil))
        alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel, handler: nil))
        alert.addAction(UIAlertAction(title: "Launch the Missile", style: UIAlertAction.Style.destructive, handler: nil))

        // show the alert
        self.present(alert, animated: true, completion: nil)
    }
}

Manejo de grifos de botones

El handlerestaba nilen los ejemplos anteriores. Puede reemplazarlo nilcon un cierre para hacer algo cuando el usuario toca un botón. Por ejemplo:

alert.addAction(UIAlertAction(title: "Launch the Missile", style: UIAlertAction.Style.destructive, handler: { action in

    // do something like...
    self.launchMissile()

}))

Notas

  • Los botones múltiples no necesariamente necesitan usar diferentes UIAlertAction.Styletipos. Podrían ser todos .default.
  • Para más de tres botones, considere usar una Hoja de acción. La configuración es muy similar. Aquí hay un ejemplo.
Suragch
fuente
2
¿hay alguna propiedad delegada en UIAlertController? en UIAlertView hay una propiedad de delegado que a veces establecemos en self, ¿hay algo como esto en UIAlertController? Soy nuevo, por favor ayúdame
ArgaPK
Hermosa respuesta: ahora, ¿cómo podemos cambiar a una nueva vista dentro del controlador?
That1Guy
114

Puede crear una alerta UIA usando el constructor estándar, pero el 'legado' parece no funcionar:

let alert = UIAlertView()
alert.title = "Alert"
alert.message = "Here's a message"
alert.addButtonWithTitle("Understood")
alert.show()
Ben Gottlieb
fuente
8
UIAlertView está en desuso. Utilice UIAlertController con un PreferredStyle de UIAlertControllerStyleAlert en su lugar.
Zorayr
16
@Zorayr UIAlertController solo está disponible desde iOS 8 en adelante, por favor también mencione eso cuando sugiera su uso. Hay situaciones en las que aún se desea la compatibilidad con iOS7 y las personas pueden perder el problema. La desaprobación no significa "nunca más uses esto".
Sami Kuhmonen
2
Esto funciona si su aplicación todavía está dirigida a iOS 7. Sin embargo, idealmente, UIAlertView solo debe usarse cuando UIAlertController no está disponible. if NSClassFromString ("UIAlertController")! = nil {/ * use UIAlertController * /} else {/ * use UIAlertView * /}
phatblat
UIAlertview () ahora está en desuso en iOS 9
Rizwan Ahmed
31

En Swift 4.2 y Xcode 10

Método 1 :

ALERTA SIMPLE

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

Método 2:

ALERTA CON CLASE COMPARTIDA

Si desea estilo de clase compartida (escriba una vez, use 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 a alertas como esta en cada vajilla

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

Método 3:

ALERTA ACTUAL SUPERIOR DE TODAS LAS VENTANAS

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

Función de llamada

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

Método 4:

Alerta con extensión

extension  UIViewController {

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

Ahora llama así

//Call showAlert function in your class
@IBAction func onClickAlert(_ sender: UIButton) {
    showAlert(withTitle:"Your Title Here", withMessage: "YourCustomMessageHere")
}

Método 5:

ALERTA CON TEXTFIELDS

Si desea agregar campos de texto para alertar.

//Global variables
var name:String?
var login:String?

//Call this function like this:  alertWithTF() 
//Add textfields to alert 
func alertWithTF() {

    let alert = UIAlertController(title: "Login", message: "Enter username&password", preferredStyle: .alert)
    // Login button
    let loginAction = UIAlertAction(title: "Login", style: .default, handler: { (action) -> Void in
        // Get TextFields text
        let usernameTxt = alert.textFields![0]
        let passwordTxt = alert.textFields![1]
        //Asign textfileds text to our global varibles
        self.name = usernameTxt.text
        self.login = passwordTxt.text

        print("USERNAME: \(self.name!)\nPASSWORD: \(self.login!)")
    })

    // Cancel button
    let cancel = UIAlertAction(title: "Cancel", style: .destructive, handler: { (action) -> Void in })

    //1 textField for username
    alert.addTextField { (textField: UITextField) in
        textField.placeholder = "Enter username"
        //If required mention keyboard type, delegates, text sixe and font etc...
        //EX:
        textField.keyboardType = .default
    }

    //2nd textField for password
    alert.addTextField { (textField: UITextField) in
        textField.placeholder = "Enter password"
        textField.isSecureTextEntry = true
    }

    // Add actions
    alert.addAction(loginAction)
    alert.addAction(cancel)
    self.present(alert, animated: true, completion: nil)

}

Método 6:

Alerta en SharedClass con extensión

//This is your shared class
import UIKit

 class SharedClass: NSObject {

 static let sharedInstance = SharedClass()

 //Here write your code....

 private override init() {
 }
}

//Alert function in shared class
extension UIViewController {
    func showAlert(title: String, msg: String) {
        DispatchQueue.main.async {
            let alert = UIAlertController(title: title, message: msg, preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            self.present(alert, animated: true, completion: nil)
        }
    }
}

Ahora llama directamente así

self.showAlert(title: "Your title here...", msg: "Your message here...")

Método 7:

Alerta sin clase compartida con extensión en clase separada para alerta.

Cree una nueva clase Swift, y import UIKit. Copie y pegue el siguiente código.

//This is your Swift new class file
import UIKit
import Foundation

extension UIAlertController {
    class func alert(title:String, msg:String, target: UIViewController) {
        let alert = UIAlertController(title: title, message: msg, preferredStyle: UIAlertControllerStyle.alert)
        alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default) {
        (result: UIAlertAction) -> Void in
        })
        target.present(alert, animated: true, completion: nil)
    }
}

Ahora llame a la función de alerta como esta en todas sus clases (línea única).

UIAlertController.alert(title:"Title", msg:"Message", target: self)

Cómo es....

iOS
fuente
Perfekt! +1 ¿Podría agregar un método con un tiempo de espera integrado? ¡Gracias!
PascalS
@ Passe, lo siento, no puedo entender, puede explicar brevemente.
iOS
Necesito un alertController que se presenta hasta que se hace clic en el botón 'Aceptar' o se produce un tiempo de espera. Algo así como el método 6 o 7 pero con una variable de entrada adicional 'timeout'.
PascalS
extensión UIViewController {func alertWithTime (title: String, msg: String, timeInterval: TimeInterval) {DispatchQueue.main.async {let alert = UIAlertController (title: title, message: msg, preferredStyle: .alert) alert.addAction (UIAlertAction (title : "OK", estilo: .default, handler: nil)) self.present (alert, animada: true, complete: nil) if #available (iOS 10.0, *) {Timer.scheduledTimer (withTimeInterval: timeInterval, repite: false , bloque: {_ en alert.dismiss (animado: verdadero, finalización: nulo)})} más {// Fallback en versiones anteriores}}}}
iOS
1
Si menciona timeInterval 0 en ese caso si no desea cerrar la alerta, use la condición if. if timeInterval != 0 { if #available(iOS 10.0, *) { Timer.scheduledTimer(withTimeInterval: timeInterval, repeats: false, block: { _ in alert.dismiss(animated: true, completion: nil) }) } else { // Fallback on earlier versions } }
iOS
19

Click of View

@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 OK y Cancelar

Hiren Patel
fuente
12

Si está apuntando a iOS 7 y 8, necesita algo como esto para asegurarse de que está utilizando el método correcto para cada versión, porque UIAlertViewestá en desuso en iOS 8, pero UIAlertControllerno 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()
    }
}
AstroCB
fuente
O puede ahorrar tiempo y usarlo UIAlertViewhasta que deje de admitir iOS 7. Apple no rechazará su aplicación por eso.
cprcrack
2
La desaprobación no significa "no usar esto" o que sería el "método incorrecto", solo significa que no funcionará más adelante. No es necesario usar específicamente UIAlertController en iOS8 si solo se necesitan alertas básicas. Trabajarán como antes. Hay muchas API que han quedado en desuso en iOS4 o 5 y aún funcionan en iOS8. Pero, por supuesto, las aplicaciones dirigidas a un nivel superior de iOS no deberían usarlas y es por eso que hay una advertencia de desaprobación.
Sami Kuhmonen
1
@SamiKuhmonen No, pero aclara por qué estás haciendo lo que estás haciendo y facilita la eliminación de la compatibilidad con métodos obsoletos cuando tu versión mínima es lo suficientemente alta como para hacerlo.
AstroCB
12

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!")
    }
}
knshn
fuente
1
Funciona perfectamente. Para Swift3, cambie 'presentViewController' a 'present'.
Vincent
11

Mostrar UIAlertView en 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 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)
Anit Kumar
fuente
11

Simplemente no proporcione otherButtonTitles en el constructor.

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

alertView.show()

Pero sí estoy de acuerdo con Oscar, esta clase está en desuso en iOS 8, por lo que no se utilizará UIAlertView si está utilizando una aplicación solo para iOS 8. De lo contrario, el código anterior funcionará.

Peymankh
fuente
9

Encontré este

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

aunque 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.

Mujah Maskey
fuente
Aparentemente, UIAlertView ha quedado en desuso en iOS 8 y ahora usamos UIAlertController con un estilo preferido de UIAlertControllerStyleAlert.
BlueBear
66
Si ejecuta una aplicación que necesita ser compatible con versiones anteriores de iOS7.1 y la está escribiendo en Swift, el UIAlertController bloqueará el dispositivo de destino. Debe admitir las UIAlertViews heredadas para iOS7.
Joe
Creo que no es Swift lo que causaría un bloqueo, sino el hecho de que el UIAlertController no está disponible antes de iOS 8
Frédéric Adda
7

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

Puede extender lo UIViewControllersiguiente:

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

        }
    }
emreoktem
fuente
5
    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")
                }
            }
        }
    }
Jayesh Miruliya
fuente
Simplemente escribir un trozo de código no es muy útil. Al responder cualquier pregunta (especialmente una pregunta antigua con varias respuestas, incluida una respuesta aceptada), escriba más que un código. Agregue una explicación de lo que hace su código, cómo responde la pregunta y cómo es diferente (o mejor) que las otras respuestas.
AdrianHHH
5

Tengo otro truco Supongamos que tiene 5 clases donde se aplicará una alerta de cierre de sesión. Prueba con la extensión de clase swift.

File- New- Swift class- Name it.

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.

AG
fuente
5

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

Luego 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.")
Swinny89
fuente
Gracias.
Presento
1
Hola @ Swinny89 ¡Muchas gracias por compartir esta solución con nosotros! ¡Me quedé atrapado con el cierre y me salvaste!
Bruno Campos
5

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 devolución de llamada del identificador de la acción se ha omitido porque el comportamiento predeterminado de una vista de alerta con un botón es desaparecer cuando se hace clic en el botón.

Aquí se explica cómo crear otra acción, que se podría agregar 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    
}

fuente
4

UIAlertViewObtuve el siguiente código de inicialización para compilar sin errores (creo que la última parte, la variación es quizás complicada). Pero tenía que asegurarme de que la clase de self(que paso como delegado) estaba adoptando el UIAlertViewDelegateprotocolo para que los errores de compilación desaparecieran:

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

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

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

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

Nicolas Miari
fuente
4
 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)

}
Sr. Javed Multani
fuente
4

Puede usar esta extensión simple con n número de botones y acciones asociadas swift4 y superiores

extension UIViewController {
    func popupAlert(title: String?, message: String?, actionTitles:[String?], actions:[((UIAlertAction) -> Void)?]) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        for (index, title) in actionTitles.enumerated() {
            let action = UIAlertAction(title: title, style: .default, handler: actions[index])
            alert.addAction(action)
        }
        self.present(alert, animated: true, completion: nil)
    }
}

puedes usarlo como,

self.popupAlert(title: "Message", message: "your message", actionTitles: ["first","second","third"], actions:[
            {action1 in
                //action for first btn click
            },
            {action2 in
                //action for second btn click
            },
            {action3 in
                //action for third btn click
            }, nil]) 
Midhun p
fuente
por favor no publique respuestas duplicadas. Si quieres editar tu respuesta.
iOS
Excelente respuesta Esto es lo que necesito. ¡Gracias!
Gregory Wilson Pullyattu
3

La razón por la que no funciona porque algún valor que le pasó a la función no es correcto. swift no le gusta Objective-C, puede poner nulo a los argumentos que son de tipo de clase sin ninguna restricción (podría ser). El argumento otherButtonTitles se define como no opcional que su tipo no tiene (?) Al final. entonces debes pasarle un valor concreto.

Oscar Wu
fuente
3
@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

gskril
fuente
3

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

Shaba Aafreen
fuente
3

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)
luhuiya
fuente
3

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

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

Ahora en su ViewController, llame directamente a la función anterior como si fueran provistas por UIViewController.

    yourViewController.showSuccessAlert(withTitle: 
      "YourTitle", andMessage: "YourCustomTitle")
Shikha Budhiraja
fuente
En general, las respuestas son mucho más útiles si incluyen una explicación de lo que se pretende que haga el código y por qué eso resuelve el problema sin introducir otros. ¡Gracias por mejorar el valor de referencia de la respuesta y hacerla más comprensible!
Tim Diekmann
2

prueba esto. Poner código de abajo 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)
Sagar Sangani
fuente
1

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)
  }
}
Zorayr
fuente
1

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

    }

Tienes que pasar el mensaje como una cadena donde utilizas esta función.

iAnkit
fuente
1

La vieja forma: 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) {
 // ...
}
Shanmugasundharam
fuente
1

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)
Keshav Gera
fuente
1

// 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
Pratyush Pratik
fuente
1
  // 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()
Hitesh Chauhan
fuente
¿Puedes agregar una explicación al código que publicaste? Tal como está ahora, su respuesta realmente no califica como una buena respuesta según las reglas SO.
Nico Van Belle
la vista de alerta ha cambiado ahora en el controlador de alerta rápido 4.use
Sandeep Singh