ios swift dialog uialertview uialertcontroller

ios - ¿Dónde encontrar una explicación clara sobre la alerta rápida(UIAlertController)?



uialertcontroller swift 4 (3)

Una instancia del UIAlertController se puede presentar de manera modal en la pantalla, al igual que cualquier otro UIViewController que utilice el método presentViewController: animated: completed: Lo que hace que la instancia de UIAlertController se distinga entre trabajar como ActionSheet o como AlertView es el parámetro de estilo que se pasa al crearlo.

No mas delegacion

Si ha usado una UIActionSheet o UIAlertView, sabe que la forma de obtener una devolución de llamada es para una clase (en la mayoría de los casos, el controlador de vista) para implementar el protocolo UIActionSheetDelegate o UIAlertViewDelegate. Hay algunos proyectos de código abierto que reemplazaron este patrón de delegación con devoluciones de llamadas basadas en bloques, pero las API oficiales nunca se actualizaron. UIAlertController no utiliza delegación. En su lugar, tiene una colección de elementos UIAlertAction, que usan cierres (o bloques si está utilizando Objective-C) para manejar la entrada del usuario.

Para la hoja de acción

@IBAction func showActionSheet(sender: AnyObject) { //Create the AlertController let actionSheetController: UIAlertController = UIAlertController(title: "Action Sheet", message: "Swiftly Now! Choose an option!", preferredStyle: .ActionSheet) //Create and add the Cancel action let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in //Just dismiss the action sheet } actionSheetController.addAction(cancelAction) //Create and add first option action let takePictureAction: UIAlertAction = UIAlertAction(title: "Take Picture", style: .Default) { action -> Void in //Code for launching the camera goes here } actionSheetController.addAction(takePictureAction) //Create and add a second option action let choosePictureAction: UIAlertAction = UIAlertAction(title: "Choose From Camera Roll", style: .Default) { action -> Void in //Code for picking from camera roll goes here } actionSheetController.addAction(choosePictureAction) //Present the AlertController self.presentViewController(actionSheetController, animated: true, completion: nil) }

Para AlertView con campo de texto

@IBAction func showAlert(sender: AnyObject) { //Create the AlertController let actionSheetController: UIAlertController = UIAlertController(title: "Alert", message: "Swiftly Now! Choose an option!", preferredStyle: .Alert) //Create and add the Cancel action let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in //Do some stuff } actionSheetController.addAction(cancelAction) //Create and an option action let nextAction: UIAlertAction = UIAlertAction(title: "Next", style: .Default) { action -> Void in //Do some other stuff } actionSheetController.addAction(nextAction) //Add a text field actionSheetController.addTextFieldWithConfigurationHandler { textField -> Void in //TextField configuration textField.textColor = UIColor.blueColor() } //Present the AlertController self.presentViewController(actionSheetController, animated: true, completion: nil) }

No se pudo encontrar una explicación clara e informativa para esto.


Después de buscar un tema sobre un tema, no encontré una explicación clara, incluso en su referencia de clase UIAlertController Reference

Está bien, pero no lo suficientemente claro para mí.

Entonces, después de recoger algunas paces, decidí hacer mi propia explicación (espero que ayude)

Así que aquí va:

  1. UIAlertView está en desuso como se señaló: UIAlertView en Swift
  2. UIAlertController debe usarse en iOS8 +, por lo tanto, para crear uno primero, necesitamos crear una instancia, el Constructor (init) obtiene 3 parámetros:

2.1 título: Cadena -> texto en negrita para mostrar en la parte superior del cuadro de diálogo de alerta

Mensaje 2.2: Cadena -> texto más pequeño (se explica bastante a sí mismo)

2.3 prefferedStyle:UIAlertControllerStyle -> definir el estilo del cuadro de diálogo, en la mayoría de los casos: UIAlertControllerStyle.Alert

  1. Ahora para mostrarlo realmente al usuario, podemos usar showViewController o presentViewController y pasar nuestra alerta como parámetro

  2. Para agregar alguna interacción con un usuario podemos usar:

4.1 UIAlertController.addAction para crear botones

4.2 UIAlertController.addTextField para crear campos de texto

Nota de edición: ejemplos de código a continuación, actualizados para la sintaxis de swift 3

Ejemplo 1 : diálogo simple

@IBAction func alert1(sender: UIButton) { //simple alert dialog let alert=UIAlertController(title: "Alert 1", message: "One has won", preferredStyle: UIAlertControllerStyle.alert); //show it show(alert, sender: self); }

Ejemplo 2 : Diálogo con un campo de entrada de texto y dos botones

@IBAction func alert2(sender: UIButton) { //Dialog with one input textField & two buttons let alert=UIAlertController(title: "Alert 2", message: "Two will win too", preferredStyle: UIAlertControllerStyle.alert); //default input textField (no configuration...) alert.addTextField(configurationHandler: nil); //no event handler (just close dialog box) alert.addAction(UIAlertAction(title: "No", style: UIAlertActionStyle.cancel, handler: nil)); //event handler with closure alert.addAction(UIAlertAction(title: "Yes", style: UIAlertActionStyle.default, handler: {(action:UIAlertAction) in let fields = alert.textFields!; print("Yes we can: "+fields[0].text!); })); present(alert, animated: true, completion: nil); }

Ejemplo 3 : Un campo de entrada de texto personalizado y un botón

@IBAction func alert3(sender: UIButton) { // one input & one button let alert=UIAlertController(title: "Alert 3", message: "Three will set me free", preferredStyle: UIAlertControllerStyle.alert); //configured input textField var field:UITextField?;// operator ? because it''s been initialized later alert.addTextField(configurationHandler:{(input:UITextField)in input.placeholder="I am displayed, when there is no value ;-)"; input.clearButtonMode=UITextFieldViewMode.whileEditing; field=input;//assign to outside variable(for later reference) }); //alert3 yesHandler -> defined in the same scope with alert, and passed as event handler later func yesHandler(actionTarget: UIAlertAction){ print("YES -> !!"); //print text from ''field'' which refer to relevant input now print(field!.text!);//operator ! because it''s Optional here } //event handler with predefined function alert.addAction(UIAlertAction(title: "Yes", style: UIAlertActionStyle.default, handler: yesHandler)); present(alert, animated: true, completion: nil); }

Espero que ayude, y buena suerte ;-)


Parte de la sintaxis ha cambiado desde las respuestas originales. Aquí hay un código de muestra que alerta al usuario si no ha iniciado sesión en iCloud.

CKContainer.default().accountStatus { (accountStatus, error) in switch accountStatus { case .available: print("iCloud Available") case .noAccount: print("No iCloud account") //simple alert dialog let alert=UIAlertController(title: "Sign in to iCloud", message: "This application requires iClound. Sign in to your iCloud account to write records. On the Home screen, launch Settings, tap iCloud, and enter your Apple ID. Turn iCloud Drive on. If you don''t have an iCloud account, tap Create a new Apple ID", preferredStyle: UIAlertControllerStyle.alert); //no event handler (just close dialog box) alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: nil)); //show it self.present(alert, animated: true, completion: nil) case .restricted: print("iCloud restricted") case .couldNotDetermine: print("Unable to determine iCloud status") } }