Home » Guías » Las nuevas alertas de iOS 8, UIAlertController (Guía de Desarrollo)
Guía UIAlertController

Las nuevas alertas de iOS 8, UIAlertController (Guía de Desarrollo)

Uno de los elementos más usados en las apps son las alertas de sistema: ventanas modales que además oscurecen el resto de la interfaz para poner el foco en ellas mismas. De esta forma, se pueden mostrar mensajes o buscar una pequeña interactividad con el usuario en cuanto a si acepta o no informaciones.

En iOS 8 Apple ha deprecado el uso de UIAlertView, el sistema que se usaba hasta ahora, y ha creado una nueva y mas elegante forma de hacerlas: a través de un controlador dedicado.

La forma de crear estas nuevas alertas es bastante sencilla:

  • Creamos una instancia UIAlertController a la que damos los datos básicos de título y descripción, así como el tipo de alerta (UIAlertControllerStyle) que vamos a usar: Alerta o Formulario de acciones.
  • Si vamos a utilizar acciones, creamos los bloques (en Objective-C) o los closures (en Swift) que vayan a ejecutarse cuando se realicen las acciones pertinentes.
  • Se crea un UIAlertAction al que se le asocia cada bloque o closure, asociando a su vez dicha acción a nuestro UIAlertController.
  • Usamos presentViewController para mostrar nuestro controlador y listo.

No existen delegaciones a las acciones de la alerta, por lo que hemos de controlar que si queremos quitar dicha alerta, sea una de las opciones que hemos puesto en nuestro bloque o closure. Invocamos dismissViewControllerAnimated del propio controlador y nada más.

Ejemplo para una app

Veamos el siguiente ejemplo en Swift u Objective-C de cómo crear una simple alerta que muestre un mensaje, con un botón OK que nos permita salir.

  • Swift
  • Objective-C

Ejemplos de alertasSi nos fijamos, hemos indicado en nuestra acción un tipo, que en este caso es Default. Disponemos igualmente de dos tipos más: Cancel que indica que es una acción que cancela algo lo que llevaría implícito el quitar esta alerta tras realizar la acción y no necesitaríamos poner el dismissViewControllerAnimated. La otra opción Destructive indica que elegir esta opción provocará alguna acción que destruirá datos o cambiará algo importante.

En realidad, mientras el primer estilo Cancel nos ahorra el tener que quitar la alerta, el tipo Destructive solo hará que la opción en concreto aparezca en color rojo, siguiendo la guía de estilo de Apple a la hora de alertar al usuario que tiene que “pensárselo dos veces” antes de darle a esta opción.

Como es obvio, si creamos más de una acción y la asociamos a nuestra alerta, tendremos más de un botón.

Alerta Action Sheet u hoja de acciones

Vamos a modificar levemente el código que hemos creado para usar dos opciones en vez de una:

  • Swift
  • Objective-C

Hemos añadido una segunda acción. Esta es de tipo Cancel lo que nos evitará tener que quitar la alerta, pero lo más importante, hemos cambiado el estilo de la alerta a ActionSheet. Esto hará que el estilo cambie radicalmente, dando mucha más presencia a esta. En un iPhone aparecerá desde la parte inferior y ocupará toda la base. En el iPad ¡¡SE CUELGA!!. Sí, señores: bienvenidos al gran descubrimiento de iOS 8: el UIPopoverController.

En iOS 8 ninguna ventana que se considere formulario modal puede mostrarse invocando un simple presentViewController. Hay que mostrar este controlador dentro de un control UIPopoverController que nos proporciona una ventana emergente dentro del contexto de la app y donde habremos de dar una ubicación de un elemento del que parte dicho Popover. Por ejemplo, si este se muestra al pulsar un botón, deberemos pasar el frame de dicho botón para que sepa el contexto en que ha de colocarse.

Veamos la implementación anterior, pero funcionando en un iPad con iOS 8:

  • Swift
  • Objective-C

Ejemplo de AlertaY si ahora ejecutamos en el iPad veremos que no se cuelga y nos situa una ventana emergente dentro del contexto de la app. Esta norma se aplica a otros tipos de controladores como el UIActivityViewController (para compartir cualquier contenido en redes sociales u otras aplicaciones) o el UIImagePickerController para seleccionar una foto de la biblioteca de fotos, por ejemplo. Igualmente, hemos de tener cuidado con la posición pues si la alerta al generarse rebasa los bordes de la pantalla, nos dará un error en el compilador y probablemente ni se muestre.

Pero podemos observar una cosa curiosa: el botón Cancelar no aparece. ¿Por qué? Porque al haberlo definido de tipo Cancel el sistema no lo pone ya que la forma de cancelar un Popover es simplemente pulsar fuera de este. Si cambiamos el tipo a Default veremos que vuelve a aparecer, aunque no es buena práctica hacer esto si el verdadero objeto del botón es la función Cancelar y quitar la alerta.

Campos de texto en una alerta

Y ahora vamos a intentar una cosa más. Meter un campo para, por ejemplo, una contraseña. Esto se consigue invocando el método addTextFieldWithConfigurationHandler de nuestro controlador y pasando un bloque con un UITextField. Este bloque lo que hace es ejecutarse previamente y configurar nuestro campo. Vamos a colocar este código después de añadir las acciones a la alerta, antes de comprobar si usamos un iPad o no:

  • Swift
  • Objective-C

Lo único que hemos de hacer es, dentro del bloque o closure que se ejecuta en alguno de los botones, accedemos a inputTextField para trabajar con su valor. ¿Qué tiene algún error? Simplemente no quitamos la alerta. Y como podemos acceder a las propiedades del controlador, podremos cambiar el título o la descripción indicando errores de introducción, por ejemplo.

Conclusiones

Hemos visto cómo se crean alertas, cómo incluir mensajes, acciones o incluso campos así como invocarlas en iPhone y iPad. Solo nos queda mencionar que si usáis SpriteKit y queréis invocar, el acceso cambia levemente. En el caso de la invocación para iPhone la línea sería en Swift:

En Objective-C es parecido:

En el caso del UIPopoverController, donde antes llamábamos a sender como el objeto que recibe al haber pulsado un botón, ahora llamamos simplemente a self.view (self.view! si es Swift). Y ojo, si usamos un SKSpriteNode como objeto de referencia, recordad que la Y está invertida en SpriteKit con respecto a UIKit. Tendréis que usar el método convertPointToView de la escena para convertir la coordenada de origen.

Y con esto cerramos la lección, instandoos a la próxima dentro de poco. Esperamos que os sea de utilidad y ya sabéis que cualquier duda o sugerencia estamos a vuestra disposición. Un saludo y Good Apple Coding.

Acerca de Julio César Fernández

Analista, consultor y periodista tecnológico, desarrollador, empresario, productor audiovisual, actor de doblaje e ingeniero de vídeo y audio.

Otras recomendaciones

ARKit

Analizando ARKit

Realizamos un análisis de ARKit, sus posibilidades, cómo funciona y lo comparamos con las Microsoft Hololens para ver el alcance de sus posibilidades. Un análisis en detalle incluyendo algunas pruebas en vídeo que hemos realizado mientras preparamos el curso de ARKit en Apple Coding Academy que verá la luz en septiembre, una vez tengamos versión final de esta interesante plataforma.