Mejores prácticas de visualización de alertas de Swift

Tengo varios controlleres en mi aplicación que requieren validation, y cuando la validation falla, quiero mostrar una alerta con los errores. ¿Hay alguna mejor práctica / patrón de layout para hacer esto? Podría simplemente crear una function estática en una class Helper así:

static func displayAlert(message: String, buttonTitle: String, vc: UIViewController) { let alertController = UIAlertController(title: "", message: message, prefernetworkingStyle: .Alert) let OKAction = UIAlertAction(title: buttonTitle, style: .Default, handler: nil) alertController.addAction(OKAction) vc.presentViewController(alertController, animated: true, completion: nil) } 

Pero luego necesito pasar el controller de vista … que parece una mala práctica. Podría disparar una notificación y observarlo, pero eso parece un exceso. ¿Estoy pensando demasiado sobre esto o hay alguna forma más aceptable de manejar algo como esto?

Terminé creando una extensión para UIViewController y creando la function de alerta allí:

 extension UIViewController { func alert(message: String, title: String = "") { let alertController = UIAlertController(title: title, message: message, prefernetworkingStyle: .Alert) let OKAction = UIAlertAction(title: "OK", style: .Default, handler: nil) alertController.addAction(OKAction) self.presentViewController(alertController, animated: true, completion: nil) } } 

Como respuesta original de itstrueimryan en https://stackoverflow.com/a/30714429/6822183

Actualización para Swift 3:

 extension UIViewController { func alert(message: String, title: String = "") { let alertController = UIAlertController(title: title, message: message, prefernetworkingStyle: .alert) let OKAction = UIAlertAction(title: "OK", style: .default, handler: nil) alertController.addAction(OKAction) self.present(alertController, animated: true, completion: nil) } } 

¿Por qué no crear una function de utilidad que devuelva el AlertView al ViewController?

 self.presentViewController(Utilities.createAlertController("errorMessage"), animated: true, completion: nil); 

Puede haber encontrado una mejor respuesta a este problema, a través de un artículo de Krakendev: https://krakendev.io/blog/subclassing-can-suck-and-heres-why .

La idea es utilizar la progtwigción orientada al protocolo para crear una implementación pnetworkingeterminada de una alerta solo para UIViewControllers:

 protocol Alertable { func issueAlert() } extension Alertable where Self: UIViewController { func issueAlert() { // alert code here } } 

Ahora, exactamente así, cada UIViewController que se adhiera a Alertable tendrá el método issueAlert () disponible sin tener que definir su propia implementación.

Y, por supuesto, también podemos definir parameters para la function issueAlert:

 extension Alertable where Self: UIViewController { func issueAlert(title: "Default Title", message: String = "Default Message") { // alert code here } } 

Entonces, nuestro controller de vista puede hacer lo siguiente:

 issueAlert() 

o

 issueAlert(title: "Error", message: "Something went wrong") 

Dos ventajas de este enfoque que se me ocurre son que usted sabe si un controller de vista tiene acceso a este método simplemente mirando el protocolo Alertable en la definición de class y los controlleres de vista individuales pueden anular este método si desean proporcionar funcionalidad personalizada . Por supuesto, ahora también puede especificar el contrato alerta como un parámetro de método.

Actualizado para swift 3:

si desea mostrar el post de alerta al usuario que se usa debajo de líneas simples de código;

// definición de function:

 func showMessageToUser(title: String, msg: String) { let alert = UIAlertController(title: title, message: msg, prefernetworkingStyle: UIAlertControllerStyle.alert) alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil)) self.present(alert, animated: true, completion: nil) } 

// llamada de function:

 self.showMessageToUser(title: "Alert", msg: "your message to user") 

// Disfruta de la encoding …