ios swift delay uialertview uiactivityindicatorview

ios - Descartar UIAlertView después de 5 segundos de Swift



delay uiactivityindicatorview (7)

He creado un UIAlertView que contiene un UIActivityIndicator. Todo funciona muy bien, pero también me gustaría que el UIAlertView desapareciera después de 5 segundos.

¿Cómo puedo descartar mi UIAlertView después de 5 segundos?

var alert: UIAlertView = UIAlertView(title: "Loading", message: "Please wait...", delegate: nil, cancelButtonTitle: "Cancel"); var loadingIndicator: UIActivityIndicatorView = UIActivityIndicatorView(frame: CGRectMake(50, 10, 37, 37)) as UIActivityIndicatorView loadingIndicator.center = self.view.center; loadingIndicator.hidesWhenStopped = true loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray loadingIndicator.startAnimating(); alert.setValue(loadingIndicator, forKey: "accessoryView") loadingIndicator.startAnimating() alert.show()


Para Swift 3

let alert = UIAlertController(title: “Alert”, message: “Message”,preferredStyle: UIAlertControllerStyle.alert) self.present(alert, animated: true, completion: nil) DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double((Int64)(5.0 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: {() -> Void in alert.dismiss(animated: true, completion: {() -> Void in }) })


// Función genérica para descartar el temporizador de alerta

/** showWithTimer */ public func showWithTimer(message : String?, viewController : UIViewController?) { let version : NSString = UIDevice.current.systemVersion as NSString if version.doubleValue >= 8 { alert = UIAlertController(title: "", message: message, preferredStyle:.alert) viewController?.present(alert ?? UIAlertController(), animated:true, completion:nil) let when = DispatchTime.now() + 5 DispatchQueue.main.asyncAfter(deadline: when){ self.alert?.dismiss(animated: true, completion: nil) } } }


Crea el objeto de alerta como una variable global. Puedes usar un NSTimer para este propósito.

var timer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: Selector("dismissAlert"), userInfo: nil, repeats: false) func dismissAlert() { // Dismiss the alert from here alertView.dismissWithClickedButtonIndex(0, animated: true) }

NOTA:

Importante: UIAlertView está en desuso en iOS 8. (Tenga en cuenta que UIAlertViewDelegate también está en desuso). Para crear y administrar alertas en iOS 8 y versiones posteriores, use UIAlertController con un estilo preferido de UIAlertControllerStyleAlert.

Referencia: UIAlertView


En Swift 2 puedes hacer esto. Crédito para @Lyndsey Scott

let alertController = UIAlertController(title: "youTitle", message: "YourMessage", preferredStyle: .Alert) self.presentViewController(alertController, animated: true, completion: nil) let delay = 5.0 * Double(NSEC_PER_SEC) let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) dispatch_after(time, dispatch_get_main_queue(), { alertController.dismissViewControllerAnimated(true, completion: nil) })


Para swift 4 puedes usar este código

let alertController = UIAlertController(title:"Alert",message:nil,preferredStyle:.alert) self.present(alertController,animated:true,completion:{Timer.scheduledTimer(withTimeInterval: 5, repeats:false, block: {_ in self.dismiss(animated: true, completion: nil) })}


Puedes descartar tu UIAlertView luego de un retraso de 5 segundos programáticamente, así:

alert.show() // Delay the dismissal by 5 seconds let delay = 5.0 * Double(NSEC_PER_SEC) var time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) dispatch_after(time, dispatch_get_main_queue(), { alert.dismissWithClickedButtonIndex(-1, animated: true) })


Una solución para descartar una alerta automáticamente en Swift 3 y Swift 4 (Inspirado por parte de estas respuestas: [1] , [2] , [3] ):

// the alert view let alert = UIAlertController(title: "", message: "alert disappears after 5 seconds", preferredStyle: .alert) self.present(alert, animated: true, completion: nil) // change to desired number of seconds (in this case 5 seconds) let when = DispatchTime.now() + 5 DispatchQueue.main.asyncAfter(deadline: when){ // your code with delay alert.dismiss(animated: true, completion: nil) }

Resultado: