Tengo el siguiente código repetido en muchos de mis view controllers. Me gustaría refactorizarlo en un controlador de clase / vista global. Sin embargo, todavía quiero que se muestre con el padre como el controlador de vista actual para que cuando haga clic en Aceptar vuelva al controlador de vista actual donde ocurrió el error. ¿Cuál debería ser el nombre de esa clase global y debería subclase UIViewController?

    //--------------------------------------
    // MARK: - Alert Error Message
    //--------------------------------------
    func displayAlertMessage(title:String,message:String)
    {
        let alertMessage = UIAlertController(title: title, message: message, preferredStyle:UIAlertControllerStyle.alert);

        let okAction = UIAlertAction(title:"OK", style: .default, handler:nil);

        alertMessage.addAction(okAction);

        self.present(alertMessage, animated: true, completion: nil);
    }
0
Maria 9905 27 feb. 2018 a las 02:38

5 respuestas

La mejor respuesta

Puede crear una extensión UIViewController e implementar este método allí. Esto le permitirá llamarlo desde cualquier subclase UIViewController.

extension UIViewController {

    func displayAlertMessage(title: String, message: String)
    {
        let alertMessage = UIAlertController(title: title, message: message, preferredStyle:UIAlertControllerStyle.alert);

        let okAction = UIAlertAction(title:"OK", style: .default, handler:nil);

        alertMessage.addAction(okAction);

        self.present(alertMessage, animated: true, completion: nil);
    }
}

También puede agregar parámetros handler y completion a la función displayAlertMessage, lo que le permitiría personalizar tanto el controlador de acción como lo que sucede cuando la alerta termina de presentarse, desde la llamada punto.

3
Cezar 26 feb. 2018 a las 23:58

Me gustan las extensiones para esto.

Si extiende uiviewcontroller, debería poder poner esta función dentro y luego podría llamarla desde cualquier controlador de vista.

2
Steve 26 feb. 2018 a las 23:42

Swift 4.0

Puede usar el cierre de acciones para múltiples acciones.

extension UIViewController {

    func popupAlert(title: String?, message: String?, actionTitles:[String?], actions:[((UIAlertAction) -> Void)?]) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        for (index, title) in actionTitles.enumerated() {
            let action = UIAlertAction(title: title, style: .default, handler: actions[index])
            alert.addAction(action)
        }
        self.present(alert, animated: true, completion: nil)
    }
}

Y puedes usarlo así en UIViewController

 popupAlert(title: kTitle, message: "This is test alert!!!!" , actionTitles: ["Ok","Cancel"], actions: [ { action1 in
            //perform action for OK button
            }, { action2 in
           //perform action for cancel button
  }])
1
Jaydeep 27 feb. 2018 a las 03:46

Es simple Simplemente cree una nueva clase NSObject y haga lo siguiente

class WrapperClass: NSObject 
{    
    class func BasicAlert(_ title : String, message : String, view:UIViewController)
    {
        let alert = UIAlertController(title:title, message:  message, preferredStyle: UIAlertControllerStyle.alert)
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
        view.present(alert, animated: true, completion: nil)
    }
}

Uso

WrapperClass.BasicAlert("Error", message: "Bluetooth Headset is Not Connected, Please Retry", view: self)
0
iOS Geek 27 feb. 2018 a las 05:16

Puede usar SCLAlertView para la creación de alertas simples. La alerta siempre se muestra desde el controlador de vista actual y vuelve a este controlador cuando se cierra la alerta. Esta función estática muestra un mensaje simple con un botón Aceptar. Por supuesto, también puede agregar campos de texto, botones y otros elementos. Estas alertas son especialmente agradables porque puede llamarlas en cualquier punto de su código, incluso desde colas en segundo plano.

class Alerts {

    static func showAlert(title: String, message: String) {
        DispatchQueue.main.async {
            let alert = SCLAlertView()
            alert.showCustom(title, subTitle: message, color: UIColor.blue, icon: UIImage(named: "logo")!, closeButtonTitle: "OK")
        }
    }

}
0
sundance 27 feb. 2018 a las 21:30