2015-03-31 57 views
14

我在我的应用程序的注册过程中使用Twitter登录。我要求用户的电子邮件。一旦我得到它,我想提出一个UIAlertController。Swift尝试呈现其视图不在窗口层次结构中的UIAlertController(在TWTRShareEmailViewController之后呈现)

这里是我的代码:

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没有被驳回):

警告:试图提出UIALertController上xViewController其 看法是不在窗口层次结构中!

任何想法,我应该写这个?我如何知道TWTRShareEmailViewController何时被解雇以继续注册过程并能够呈现我的UIAlertController?我不知道与TWTRShareEmailViewController相关的代理方法。

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

回答

31

找到解决方案here。我可能做错了,但如果不是,它可能是一个苹果的错误。解决方法是推迟UIAlertController的呈现:

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

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

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

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


编辑 更新斯威夫特:

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

您是否找到针对此问题的更好解决方案?我也在使用dispatch_async – 2016-03-04 15:50:46

+0

正如我在编辑回复中解释的那样,我有一个专门针对Twitter的东西。因此,当用户想用Twitter登录时,我模式地展示了我的'TWLoginVC',其中的一切都完成了(在某些情况下避免了奇怪的行为,例如VC之间的特殊转换)。但是我改了一下我的代码,我不需要再提供一个UIAlertController。所以没有抱歉,我没有更好的解决方案:/ – 2016-03-04 17:43:58

+1

随着新的TwitterKit(我刚刚更新到2.0版。2),要求更改用户电子邮件的方式。它在Twitter文档中解释:https://docs.fabric.io/ios/twitter/request-user-email-address.html。 – 2016-04-22 12:56:26

5

下面是斯威夫特3更新的答案基于玛丽DM的回答上的Xcode 8测试。

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

如果DispatchQueue.main.sync造成挤压,尝试DispatchQueue.main.async。 “异步”为我的问题工作,而从contactPicker()返回。

相关问题