2016-02-24 3 views
2

J'essaie de présenter une alerte de déconnexion. Lorsque l'utilisateur appuie sur Oui, je veux que mon contrôleur de vue à rejeter avec une méthode qui peut me fournir un gestionnaire d'achèvement.Annuler un contrôleur de vue avec un UIAlertAction

Le contrôleur de vue se trouve dans un contrôleur de navigation et est le deuxième sur la pile.

je suis venu avec le code suivant:

@IBAction func logOut() { 
     let logOutAlert = UIAlertController.init(title: "Log out", message: "Are you sure ?", preferredStyle:.Alert) 

     logOutAlert.addAction(UIAlertAction.init(title: "Yes", style: .Default) { (UIAlertAction) -> Void in 
      //Present entry view ==> NOT EXECUTED 
      self.dismissViewControllerAnimated(true, completion:nil) 
     }) 

     logOutAlert.addAction(UIAlertAction.init(title: "Cancel", style: .Cancel, handler: nil)) 

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

La ligne self.dismissViewControllerAnimated(true, completion:nil) est lu, mais il ne fait rien.

Répondre

3

Je soupçonne que dismissViewControllerAnimated ne fait rien pour vous parce que le contrôleur de vue n'est pas présenté de façon modale, mais montré au moyen d'un contrôleur de navigation. Pour rejeter est, vous pouvez dire au contrôleur de navigation pour la pop de la pile, comme ceci:

logOutAlert.addAction(UIAlertAction.init(title: "Yes", style: .Default) { (UIAlertAction) -> Void in 
     self.navigationController?.popViewControllerAnimated(true) 
     }) 

Malheureusement, popViewControllerAnimated ne semble pas fournir un moyen de joindre votre propre gestionnaire d'achèvement de la boîte. Si vous avez besoin d'un, vous pouvez toujours ajouter un en utilisant le CATransaction associé, ce qui pourrait ressembler à ceci:

logOutAlert.addAction(UIAlertAction.init(title: "Yes", style: .Default) { (UIAlertAction) -> Void in 
     CATransaction.begin() 
     CATransaction.setCompletionBlock(/* YOUR BLOCK GOES HERE */) 
     self.navigationController?.popViewControllerAnimated(true) 
     CATransaction.commit() 
     }) 
+1

Merci pour l'astuce CATransaction je ne savais pas! –