我在我的应用的注册过程中使用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
相关的委托方法。
感谢任何帮助。感谢。
答案 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”适用于我的问题。