2014-12-23 6 views
23

Ich habe eine UIAlertView erstellt, die einen UIActivityIndicator enthält. Alles funktioniert gut, aber ich möchte auch, dass das UIAlertView nach 5 Sekunden verschwindet.UIAlertView nach 5 Sekunden entfernen Swift

Wie kann ich meine UIAlertView nach 5 Sekunden beenden?

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

Wenn Sie etwas laden, warum sollten Sie den Alarm nach einer bestimmten Zeit verbergen? Würden Sie es lieber verstecken, wenn das Laden abgeschlossen ist? – drewag

Antwort

39

Sie können Ihre UIAlertView nach einer Verzögerung von 5 Sekunden programmatisch, wie so abtun:

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

Die zweite Funktion muss nicht erstellt werden. Im Block 'dispatch_after' rufen Sie einfach 'alert.dismissWithClickedButtonIndex (-1, animiert: true)' auf. – rmaddy

+0

@rmaddy Sehr wahr. –

+0

BTW - Ich mag diesen Ansatz besser als mit einem Timer. – rmaddy

6

Erstellen des Alarmobjekt als globalen Variable. Sie können einen NSTimer für diesen Zweck verwenden.

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) 

} 

HINWEIS:

Wichtig: UIAlertView in iOS ist veraltet 8. (Beachten Sie, dass UIAlertViewDelegate ist auch veraltet.) So erstellen und Warnungen in iOS 8 zu verwalten und später, stattdessen verwenden UIAlertController mit einem preferredStyle von UIAlertControllerStyleAlert.

Referenz: UIAlertView

13

in swift 2 Sie können dies tun. Kredit @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

Was passiert ist, gibt es eine Schaltfläche OK in der Warnung und der Benutzer klickt es vor dem Versand ausgeführt wird? –

+0

Was wäre wenn? Probieren Sie es aus und sehen Sie, was passiert. Ich verstehe die Frage nicht ... –

+0

Ich fragte mich, ob es abstürzen würde, da der alertControler bereits abgewiesen würde, wenn der Benutzer die OK-Taste vor der 5 Sekunden Verzögerung vorstellte. Ich habe es versucht und ich bekomme keine Fehlermeldung. Also ich denke, es ist in Ordnung. –

44

Eine Lösung eine Benachrichtigung automatisch in Swift 3 und Swift 4 (Inspiriert durch einen Teil dieser Antworten: [1], [2], [3]): abzutun

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

Ergebnis:

enter image description here

+2

Vielen Dank ... es hat mir geholfen .. –

1

Für 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

// Allgemeinfunktion für Gefahren WRT Dismissing 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

Für das schnelle 4 Sie diesen Code verwenden können

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