Swift尝试呈现其视图不在窗口层次结构中的UIAlertController(在TWTRShareEmailViewController之后呈现)

我在我的应用程序的注册过程中使用Twitterlogin。 我要求用户的电子邮件。 一旦我得到它,我想提出一个UIAlertController。

这是我的代码:

func askForTWMail(){ if (Twitter.sharedInstance().session() != nil) { let shareMailVC=TWTRShareEmailViewController(completion: {(mail:String!, 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) } 

但是我得到这个错误(我猜是因为TWTRShareEmailViewController不被解雇):

警告:尝试在其视图不在窗口层次结构中的xViewController上呈现UIALertController!

任何想法,我应该如何写这个? 我怎么知道什么时候TWTRShareEmailViewController被解散,继续注册过程,并能够呈现我的UIAlertController ? 我不知道与TWTRShareEmailViewController相关的委托方法。

任何帮助表示赞赏。 谢谢。

在这里find了解决办法 我可能做错了,但如果不是,它可能是一个苹果的错误。 解决方法是延迟UIAlertController

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

编辑 :我发现另一个解决方法(我不使用我放下这里的解决scheme了)。 我不得不改变这个,因为Twitter的login也打破了VC之间的转换。

我现在调用一个特定的UIViewController (我称之为TWLoginVC ),在那里我做所有的Twitterlogin和其他东西。 视图是黑色的,所以用户看不到这个过程实际上是在另一个VC中完成的(他只需要拿起他想要login的Twitter用户)。 我想你也可以把一个清晰的背景变得更加隐形。

当我调用这个视图控制器并closures它时,转换不适用于它,并且我没有任何问题。


编辑更新Swift:

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

以下是基于Marie Dm的答案在Xcode 8上testing的Swift 3的更新答案。

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

如果DispatchQueue.main.sync导致暗恋,请尝试DispatchQueue.main.async 。 “async”在从contactPicker()返回的过程中适用于我的问题。