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

时间:2015-03-31 09:46:25

标签: ios email swift twitter uialertcontroller

我在我的应用的注册过程中使用Twitter登录。而且我要求用户的电子邮件。一旦我得到它,我想呈现一个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相关的委托方法。

感谢任何帮助。感谢。

4 个答案:

答案 0 :(得分:31)

找到解决方案here。我可能做错了,但如果不是,那可能是Apple的错误。解决方法是延迟UIAlertController

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

编辑:我找到了另一种解决方法(我不再使用我在这里提出的解决方案)。我不得不改变这一点,因为Twitter登录也破坏了我在VC之间的过渡。

我现在调用一个特定的UIViewController(我称之为TWLoginVC),其中我执行所有Twitter登录和其他内容。视图只是黑色,因此用户不会看到该过程实际上是在另一个VC中完成的(他只需要拿起他想要登录的Twitter用户)。我想你也可以把一个明确的背景变得更加隐形。

当我调用此视图控制器并将其关闭时,转换不适用于它,我不会再遇到任何问题。


修改 更新Swift:

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

答案 1 :(得分:5)

这是基于Marie Dm的答案,在Xcode 8上测试的Swift 3的更新答案。

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

答案 2 :(得分:0)

延迟显示viewController解决了我的问题并节省了我的时间:D

Swift 4.0:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { 
    //present your view controller her
    self.presentViewController(alertController, animated: true, completion: nil)
}

答案 3 :(得分:-1)

如果DispatchQueue.main.sync引起了挤压,请尝试DispatchQueue.main.async。 从contactPicker()返回时,“async”适用于我的问题。