2016-04-19 10 views
5

Nella mia app rapida ho un UIViewController con un solo pulsante.Come posso visualizzare un messaggio popup in Swift che scompare dopo 3 secondi o può essere cancellato dall'utente immediatamente?

Questo pulsante richiama una funzione che richiama un popup che scompare dopo 3 secondi. Inoltre, dopo questo periodo, stampa un messaggio sulla console. Il codice di questa funzione è il seguente:

func showAlertMsg(title: String, message: String){ 


    let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert) 
    self.presentViewController(alertController, animated: true, completion: nil) 
    let delay = 3.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) 
    print("popup disappeared") 
    }) 

} 

Che funziona bene, ma volevo introdurre qualche miglioramento. Volevo aggiungere un pulsante che cancellasse immediatamente questo popup e quindi evitare di visualizzare il messaggio nella console. Esiste un modo per visualizzare tale popup all'utente? Inoltre - c'è un modo per mostrare in questo messaggio popup il contatore con il numero di secondi che si esaurisce che mostra quanto tempo è rimasto fino a quando il popup scompare?

+1

Ecco una risposta simile che ho scritto nel Objectice C http://stackoverflow.com/questions/36048240/countdown-nstimer-in-title-of-a-uialertcontroller-getting-a-null-instead-of-time/36048730#36048730. Essenzialmente devi usare un NSTimer per il conto alla rovescia e chiudere l'avviso dopo il tempo richiesto – Paulw11

+0

Che sembra davvero promettente, devo ammettere :) C'è qualche possibilità che tu abbia un codice smilar in swift? Non sono (ancora) familiare con obj-c: | – user3766930

risposta

5

è possibile utilizzare un NSTimer per decrementare un contatore, aggiornare la visualizzazione degli avvisi e chiudere la visualizzazione degli avvisi quando il contatore raggiunge lo 0. Questo codice è adattato dal mio Objective-C answer

class ViewController: UIViewController { 

    var alertController: UIAlertController? 
    var alertTimer: NSTimer? 
    var remainingTime = 0 
    var baseMessage: String? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated)   
     self.showAlertMsg("Test Alert", message: "This will disappear in ", time: 5) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func showAlertMsg(title: String, message: String, time: Int) { 

     guard (self.alertController == nil) else { 
      print("Alert already displayed") 
      return 
     } 

     self.baseMessage = message 
     self.remainingTime = time 

     self.alertController = UIAlertController(title: title, message: self.alertMessage(), preferredStyle: .Alert) 

     let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) { (action) in 
      print("Alert was cancelled") 
      self.alertController=nil; 
      self.alertTimer?.invalidate() 
      self.alertTimer=nil 
     } 

     self.alertController!.addAction(cancelAction) 

     self.alertTimer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(ViewController.countDown), userInfo: nil, repeats: true)  

     self.presentViewController(self.alertController!, animated: true, completion: nil)  
    } 

    func countDown() { 

     self.remainingTime -= 1 
     if (self.remainingTime < 0) { 
      self.alertTimer?.invalidate() 
      self.alertTimer = nil 
      self.alertController!.dismissViewControllerAnimated(true, completion: { 
       self.alertController = nil 
      }) 
     } else { 
      self.alertController!.message = self.alertMessage() 
     } 

    } 

    func alertMessage() -> String { 
     var message="" 
     if let baseMessage=self.baseMessage { 
      message=baseMessage+" " 
     } 
     return(message+"\(self.remainingTime)") 
    }  
} 
+0

Ecco un collegamento al codice Swift 3 aggiornato: https://gist.github.com/anonymous/aadd8e56f2049062c68458c477c28a34 – Fluidity

0

So che questo direttamente non risponde alla tua domanda, ma hai considerato l'utilizzo di MBProgressHUDSCLAlertView? Entrambi offrono funzioni che ti consentono di visualizzare un avviso che scompare dopo un determinato periodo di tempo. SCLAlertView consente all'utente di cancellare immediatamente dove non lo fa MBProgressHUD. Se vuoi maggiori informazioni su come implementarle, fammelo sapere così posso aggiungere ulteriori informazioni!

+0

Ehi @DanL, grazie, SCLAlertView sembra interessante! Tuttavia, c'è un modo per mostrare il contatore di quanti secondi rimangono fino alla chiusura del popup? – user3766930

+0

Non penso a cosa sia incorporato in SCLAlertView, ma non vedo alcun motivo per cui non sia possibile creare un NSTimer da mostrare all'utente. Guarderei online per un conto alla rovescia in rapido se non sai come crearne uno. Avresti quindi attivato il timer quando appare SCLAlertView. Tieni presente che, se hai impostato l'avviso per tre secondi, il timer può eseguire il conto alla rovescia di due o due secondi e mezzo perché richiede un momento di caricamento. Vorrei solo giocare con il timer per farlo funzionare. –

Problemi correlati