Fundamentos de iOS: UIAlertView y UIAlertController
Spanish (Español) translation by Javier Salesi (you can also view the original English article)
Aún si apenas estás ingresando en el mundo del desarrollo en iOS, es casi seguro que conozcas UIAlertView. La clase UIAlertView tiene una interfaz simple y es usada para presentar alertas de ventanas tipo modal.
Aunque Apple ha dejado atrás UIAlertView en iOS 8. A partir de iOS 8, se recomienda usar la clase UIAlertController para presentar action sheets (hojas de acción) y alertas de ventanas tipo modal. En este consejo rápido, te mostraré que tan fácil es transicionar de UIAlertView a UIAlertController.
1. Configuración del Proyecto
Lanza Xcode 6.3+ y crea un nuevo proyecto basado en la plantilla Single View Application.



Nombra el proyecto Alerts, establece Language en Swift, y establece Devices en iPhone. Indica a Xcode donde te gustaría guardar los archivos del proyecto y da click en Create.



Comencemos agregando un botón para desencadenar un alert view (vista de alerta). Abre Main.storyboard y agrega un botón a la view (vista) de view controller. Establece el título del botón en Show Alert y agrega las restricciones necesarias al botón para mantenerlo en su lugar.



Abre ViewController.swift y agrega una acción a la implementación de la clase. Por el momento deja vacía la implementación de la acción. Vuelve a Main.storyboard y conecta la acción showAlert de view controller con el evento Touch Up Inside del botón.
1 |
@IBAction func showAlert(sender: AnyObject) { |
2 |
|
3 |
}
|
2. UIAlertView
Comencemos mostrando un alert view usando la clase UIAlertView. Como lo mencioné, la interfaz de la clase UIAlertView es muy simple. El sistema operativo se encarga de los detalles escenciales. Así se ve la implementación actualizada de la acción showAlert.
1 |
@IBAction func showAlert(sender: AnyObject) { |
2 |
// Initialize Alert View
|
3 |
let alertView = UIAlertView(title: "Alert", message: "Are you okay?", delegate: self, cancelButtonTitle: "Yes", otherButtonTitles: "No") |
4 |
|
5 |
// Configure Alert View
|
6 |
alertView.tag = 1 |
7 |
|
8 |
// Show Alert View
|
9 |
alertView.show() |
10 |
}
|
La inicialización es sencilla. Proporcionamos un título y un mensaje, pasamos un objeto delegado, un titulo para el botón de cancelar, y títulos para cualquier otro botón que nos gustaría incluir.
El objeto delegado necesitar cumplir con el protocolo UIAlertViewDelegate. Debido a que view controller actuará como el delegado de alert view, la clase ViewController necesita cumplir con el protocolo UIAlertViewDelegate.
1 |
import UIKit |
2 |
|
3 |
class ViewController: UIViewController, UIAlertViewDelegate { |
4 |
...
|
5 |
}
|
Los métodos del protocolo UIAlertViewDelegate son definidos como opcionales. El método que usarás más frecuentemente es alertView(_:clickedButtonAtIndex:). Éste método es invocado cuando el usuario pulsa uno de los botones de alert view. Así es como se pudiera ver la implementación de alertView(_:clickedButtonAtIndex:).
1 |
func alertView(alertView: UIAlertView, clickedButtonAtIndex buttonIndex: Int) { |
2 |
if alertView.tag == 1 { |
3 |
if buttonIndex == 0 { |
4 |
println("The user is okay.") |
5 |
} else { |
6 |
println("The user is not okay.") |
7 |
}
|
8 |
}
|
9 |
}
|
Compila y ejecuta la aplicación en el simulador iOS para ver si todo está funcionando como se esperaba.



3. UIAlertController
La interfaz de UIAlertController es muy diferente de la de UIAlertView, pero la motivación de Apple para transicionar a la clase UIAlertController se entiende después de que lo usas unas cuantas veces. Es una interfaz elegante que se sentirá familiar.
El primer beneficio de usar la clase UIAlertController es la ausencia de un protocolo delegado para manejar la interacción del usuario. Ésto significa que solo necesitamos actualizar la implementación de la acción showAlert. Observa la implementación actualizada debajo.
1 |
@IBAction func showAlert(sender: AnyObject) { |
2 |
// Initialize Alert Controller
|
3 |
let alertController = UIAlertController(title: "Alert", message: "Are you okay?", preferredStyle: .Alert) |
4 |
|
5 |
// Initialize Actions
|
6 |
let yesAction = UIAlertAction(title: "Yes", style: .Default) { (action) -> Void in |
7 |
println("The user is okay.") |
8 |
}
|
9 |
|
10 |
let noAction = UIAlertAction(title: "No", style: .Default) { (action) -> Void in |
11 |
println("The user is not okay.") |
12 |
}
|
13 |
|
14 |
// Add Actions
|
15 |
alertController.addAction(yesAction) |
16 |
alertController.addAction(noAction) |
17 |
|
18 |
// Present Alert Controller
|
19 |
self.presentViewController(alertController, animated: true, completion: nil) |
20 |
}
|
La inicialización es muy fácil. Pasamos un titulo, un mensaje, y lo más importante, establecemos el estilo preferido en UIAlertControllerStyle.Alert o .Alert para abreviar. El estilo preferido indica al sistema operativo si el alert controller (controlador de alerta) necesita ser presentado como un action sheet, .ActionSheet, o una alerta de ventana tipo modal, .Alert.
En lugar de proporcionar títulos para los botones y manejar la interacción del usuario a través del protocolo UIAlertViewDelegate, añadimos acciones al alert controller. Cada acción es una instancia de la clase UIAlertAction. Crear un UIAlertAction es sencillo. El inicializador acepta un título, un estilo y un manejador. El argumento de estilo es de tipo UIAlertActionStyle. El manejador es una clausura, que acepta el objeto UIAlertAction como su único argumento.
El uso de manejadores en lugar de un protocolo delegado hace más elegante y más fácil de entender la implementación de una alerta de ventana tipo modal. Ya no hay necesidad de pulsar alert view si estás trabajando con múltiples alertas de ventana tipo modal.
Antes de que presentemos el alert controller al usuario, agregamos las dos acciones al llamar a addAction(_:) en el objeto alertController. Nota que el orden de los botones de la alerta de ventana tipo modal es determinada por el orden en el que las acciones son agregadas al alert controller.
Debido a que la clase UIAlertController es una subclase UIViewController, presentar el alert controller al usuario es tan sencillo como llamar a presentViewController(_:animated:completion:), pasando el alert controller como el primer argumento.
4. UIActionSheet
No es sorpresa, que Apple también dejo fuera de uso la clase UIActionSheet y el protocolo UIActionSheetDelegate. A partir de iOS 8, se recomienda usar la clase UIAlertController para presentar un action sheet.
Presentar un action sheet es idéntico a presentar una alerta de ventana tipo modal. La única diferencia es que la propiedad preferredStyle del alert controller, que necesita ser establecida en UIAlertControllerStyle.ActionSheet, o .ActionSheet por abreviar, para action sheets.
Conclusión
Aunque UIAlertView y UIActionSheet ya no se usan en iOS 8, puedes continuar utilizándolas para el futuro previsible. La interfaz de la clase UIAlertController, sin embargo, es una mejora definitiva. Añade simplicidad y unifica la API para presentar alertas de ventana tipo modal y action sheets. Y porque UIAlertController es una subclase UIViewController, la API ya se sentirá familiar.
¡Sé el primero en conocer las nuevas traducciones–sigue @tutsplus_es en Twitter!



