Swift Essayez de présenter UIAlertController dont la vue ne figure pas dans la hiérarchie des windows (présentée après TWTRShareEmailViewController)

J'utilise la connection Twitter dans le process d'inscription de mon application. Et je request l'email de l'user. Une fois que je l'aurai, j'aimerais présenter un UIAlertController.

Voici mon code:

func askForTWMail(){ if (Twitter.sharedInstance().session() != nil) { let shareMailVC=TWTRShareEmailViewController(completion: {(mail:Ssortingng!, error:NSError!) in if (mail != nil) { print("GOT MAIL: \(mail)") self.gotMail() }else{ print("MAIL VC ERROR: \(error)") } }) println("PRESENT MAIL VC") self.presentViewController(shareMailVC, animated: true, completion: nil) }else{ println("User not logged in") } } func gotMail(){ var alertController=UIAlertController(title: "Some title", message: "Some message", preferredStyle: UIAlertControllerStyle.Alert) var okAction=UIAlertAction(title:"Yes", style: UIAlertActionStyle.Default) { UIAlertAction in //some action } var cancelAction=UIAlertAction(title:"No", style: UIAlertActionStyle.Cancel){ UIAlertAction in //some action } alertController.addAction(okAction) alertController.addAction(cancelAction) self.presentViewController(alertController, animated: true, completion: nil) } 

Mais je reçois cette erreur (je suppose que le TWTRShareEmailViewController n'est pas rejeté):

Attention: Essayez de présenter UIALertController sur xViewController dont la vue ne se trouve pas dans la hiérarchie des windows!

Une idée de comment je devrais écrire cela? Comment puis-je savoir quand le TWTRShareEmailViewController est TWTRShareEmailViewController pour continuer le process d'inscription et être capable de présenter mon UIAlertController ? Je ne suis pas au courant d'une méthode déléguée liée à TWTRShareEmailViewController .

Toute aide est appréciée. Merci.

J'ai trouvé une solution ici . Je le fais probablement mal mais sinon ce pourrait être un bug d'Apple. La solution consiste à retarder la présentation du UIAlertController :

 dispatch_async(dispatch_get_main_queue(), ^{ self.presentViewController(alertController, animated: true, completion: nil) }) 

EDIT : J'ai trouvé une autre solution de contournement (je n'utilise pas la solution que je mets ici plus). J'ai dû changer cela parce que le login de Twitter brisait aussi mes transitions entre VCs.

J'appelle maintenant un UIViewController spécifique (je l'ai appelé quelque chose comme TWLoginVC ) où je fais tout le login de Twitter et d'autres choses. La vue est tout simplement noire et l'user ne voit pas que le process est réellement effectué dans un autre VC (il doit juste prendre l'user Twitter avec lequel il veut se connecter). Je suppose que vous pourriez également mettre un fond clair pour être encore plus invisible.

Quand j'appelle ce controller de vue et le rejette, la transition ne lui est pas appliquée et je n'ai plus de problème avec ça.


Mise à jour EDIT pour Swift:

 DispatchQueue.main.async{ self.present(alertController, animated: true, completion: nil) } 

Voici une réponse mise à jour pour Swift 3 testée sur Xcode 8 basée sur la réponse de Marie Dm.

 DispatchQueue.main.sync { self.present(alertController, animated: true, completion: nil) } 

Si DispatchQueue.main.sync causé l'écrasement, essayez DispatchQueue.main.async . "async" a fonctionné pour mon problème en revenant de contactPicker() .