UIAlertView en Swift: 5 errores fatales y cómo evitarlos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: por qué su UIAlertView no funciona (y qué tiene que ver Stack Overflow)

\n\n

Si alguna vez ha buscado en Google «How would I create a UIAlertView in Swift?» — no está solo. Esta pregunta en Stack Overflow ha acumulado cientos de miles de visitas. Parece que no podría ser más sencillo: mostrar al usuario una ventana emergente con un botón «Aceptar». Pero en la práctica, los principiantes (y no solo ellos) cometen los mismos errores.

\n\n

En este artículo analizaremos los 5 errores principales al crear UIAlertView en Swift, mostraremos cómo corregirlos y proporcionaremos código listo para UIAlertController, el reemplazo moderno de la API obsoleta. Si quiere escribir código limpio y funcional sin fallos — quédese con nosotros.

\n\n

Error n.º 1: Usar UIAlertView en lugar de UIAlertController

\n\n

El error más común es intentar llamar a UIAlertView en Swift moderno. Esta clase fue declarada obsoleta (deprecated) desde iOS 8. Si escribe:

\n\n
let alert = UIAlertView(title: "Error", message: "Algo salió mal", delegate: nil, cancelButtonTitle: "OK")\nalert.show()
\n\n

…lo más probable es que el compilador muestre una advertencia o un error. Y si el proyecto se compila, en el mejor de los casos la alerta no funcionará correctamente en iOS 13+.

\n\n

¿Por qué ocurre esto?

\n

Apple reemplazó UIAlertView por UIAlertController ya en iOS 8. La clase antigua ya no tiene soporte y su uso puede provocar comportamientos inesperados.

\n\n

¿Cómo solucionarlo?

\n

Use UIAlertController con el estilo preferido .alert o .actionSheet. Aquí está el código correcto:

\n\n
let alert = UIAlertController(title: "Error",\n                              message: "Algo salió mal",\n                              preferredStyle: .alert)\nalert.addAction(UIAlertAction(title: "OK", style: .default))\npresent(alert, animated: true)
\n\n

Recuerde: en Swift moderno, UIAlertView es legacy. Use siempre UIAlertController.

\n\n

Error n.º 2: Olvidar llamar a present()

\n\n

Incluso si ha creado un UIAlertController pero olvida mostrarlo, no ocurrirá nada. Literalmente. El código se ejecutará, la alerta se creará en memoria, pero el usuario no la verá.

\n\n

Ejemplo típico del error:

\n\n
func showAlert() {\n    let alert = UIAlertController(title: "Hola", message: "Mundo", preferredStyle: .alert)\n    alert.addAction(UIAlertAction(title: "OK", style: .default))\n    // ¡Olvidó present!\n}
\n\n

Resultado: silencio. Sin error, sin alerta. Se preguntará por qué el código no funciona.

\n\n

¿Cómo solucionarlo?

\n

Siempre llame a present(_:animated:completion:) en el view controller actual:

\n\n
func showAlert() {\n    let alert = UIAlertController(title: "Hola", message: "Mundo", preferredStyle: .alert)\n    alert.addAction(UIAlertAction(title: "OK", style: .default))\n    present(alert, animated: true, completion: nil)\n}
\n\n

Consejo: si llama a la alerta desde un closure o código asíncrono, asegúrese de que self (el view controller) aún exista. De lo contrario, obtendrá un crash.

\n\n

Error n.º 3: Manejo incorrecto de la pulsación de botones

\n\n

En el antiguo UIAlertView usábamos el delegado alertView(_:clickedButtonAt:). En UIAlertController es diferente: se usan closures.

\n\n

Los principiantes a menudo intentan hacer que la clase conforme a UIAlertViewDelegate e implementar los métodos del delegado, pero esto no funcionará con UIAlertController.

\n\n

Incorrecto:

\n\n
class ViewController: UIViewController, UIAlertViewDelegate {\n    func showAlert() {\n        let alert = UIAlertController(title: "Pregunta", message: "¿Está de acuerdo?", preferredStyle: .alert)\n        alert.addAction(UIAlertAction(titl                

Blogs

Book Recommendations