Introducción: por qué su UIAlertView no funciona (y qué tiene que ver Stack Overflow)
\n\nSi 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\nEn 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\nError n.º 1: Usar UIAlertView en lugar de UIAlertController
\n\nEl error más común es intentar llamar a UIAlertView en Swift moderno. Esta clase fue declarada obsoleta (deprecated) desde iOS 8. Si escribe:
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?
\nApple reemplazó UIAlertView por UIAlertController ya en iOS 8. La clase antigua ya no tiene soporte y su uso puede provocar comportamientos inesperados.
¿Cómo solucionarlo?
\nUse UIAlertController con el estilo preferido .alert o .actionSheet. Aquí está el código correcto:
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\nRecuerde: en Swift moderno, UIAlertView es legacy. Use siempre UIAlertController.
Error n.º 2: Olvidar llamar a present()
\n\nIncluso 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á.
Ejemplo típico del error:
\n\nfunc showAlert() {\n let alert = UIAlertController(title: "Hola", message: "Mundo", preferredStyle: .alert)\n alert.addAction(UIAlertAction(title: "OK", style: .default))\n // ¡Olvidó present!\n}\n\nResultado: silencio. Sin error, sin alerta. Se preguntará por qué el código no funciona.
\n\n¿Cómo solucionarlo?
\nSiempre llame a present(_:animated:completion:) en el view controller actual:
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\nConsejo: 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.
Error n.º 3: Manejo incorrecto de la pulsación de botones
\n\nEn el antiguo UIAlertView usábamos el delegado alertView(_:clickedButtonAt:). En UIAlertController es diferente: se usan closures.
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.
Incorrecto:
\n\nclass ViewController: UIViewController, UIAlertViewDelegate {\n func showAlert() {\n let alert = UIAlertController(title: "Pregunta", message: "¿Está de acuerdo?", preferredStyle: .alert)\n alert.addAction(UIAlertAction(titl