2014-12-23 11 views
23

Ho creato un UIAlertView che contiene un UIActivityIndicator. Tutto funziona alla grande, ma mi piacerebbe anche che UIAlertView scomparisse dopo 5 secondi.Ignora UIAlertView dopo 5 secondi Swift

Come disattivare il mio UIAlertView dopo 5 secondi?

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() 
+0

Se stai caricando qualcosa, perché vorresti nascondere l'avviso dopo un determinato periodo? Non preferiresti nasconderlo quando il caricamento è completo? – drewag

risposta

39

Si può respingere la vostra UIAlertView dopo un ritardo di 5 secondi a livello di codice, in questo modo:

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) 
}) 
+0

Non è necessario creare la seconda funzione. All'interno del blocco 'dispatch_after' è sufficiente chiamare' alert.dismissWithClickedButtonIndex (-1, animato: true) ' – rmaddy

+0

@rmaddy Molto vero. –

+0

BTW - Mi piace questo approccio meglio di un timer. – rmaddy

6

creare l'oggetto avviso come una variabile globale. È possibile utilizzare uno NSTimer per questo scopo.

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 è deprecato in iOS 8. (Si noti che UIAlertViewDelegate è anche sconsigliato.) Per creare e gestire gli avvisi in iOS 8 e versioni successive, invece usare UIAlertController con uno stile preferito di UIAlertControllerStyleAlert.

Riferimento: UIAlertView

13

a Swift 2 si può fare questo. Credito al @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) 
       }) 
+0

Che succede c'è un pulsante ok sull'avviso e che l'utente fa clic prima che venga eseguita la spedizione? –

+0

Cosa succede se? Prova e vedi cosa succede. Non capisco la domanda ... –

+0

Mi chiedevo se si sarebbe verificato un arresto anomalo poiché l'alertControler si sarebbe già chiuso se l'utente avesse premuto il pulsante OK prima del ritardo di 5 secondi. L'ho provato e non ricevo alcun messaggio di errore. Quindi immagino sia ok. –

44

Una soluzione a respingere un avviso automatico in Swift 3 e Swift 4 (Ispirato da parte di queste risposte: [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) 
} 

Risultato:

enter image description here

+2

Mille grazie ... mi ha aiutato .. –

1

Per 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 
}) 
}) 
0

// Funzione generico per respingere avviso WRT Timer

/** 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) 
     } 
    } 
} 
0

per SWIFT 4 è possibile utilizzare questo codice

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) 
})} 
Problemi correlati