Swift Попытка представить UIAlertController, чья точка зрения отсутствует в иерархии окон (представлена ​​после TWTRShareEmailViewController)

Я использую вход в 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 не уволен):

Предупреждение. Попробуйте представить UIALertController на xViewController, чей вид не находится в иерархии окон!

Любая идея, как я должен это написать? Как я могу узнать, когда TWTRShareEmailViewController отклоняется, чтобы продолжить процесс регистрации и сможет представить мой UIAlertController? Я не знаю метода делегата, связанного с TWTRShareEmailViewController.

Любая помощь приветствуется. Спасибо.

Ответы

Ответ 1

Нашел решение здесь. Возможно, я ошибаюсь, но если это не ошибка Apple. Обходной путь заключается в задержке представления UIAlertController:

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

EDIT: я нашел другое решение (я больше не использую решение, которое я здесь помещаю). Я должен был изменить это, потому что вход в Twitter также нарушал мои переходы между VC.

Теперь я вызываю конкретный UIViewController (я назвал его чем-то вроде TWLoginVC), где я делаю все вход в Twitter и прочее. Вид просто черный, поэтому пользователь не видит, что процесс фактически выполняется в другом VC (он просто должен забрать пользователя Twitter, с которым он хочет зарегистрироваться). Думаю, вы могли бы также сделать четкий фон еще более невидимым.

Когда я вызываю этот контроллер представления и увольняю его, переход к нему не применяется, и у меня нет с ним никаких проблем.


ИЗМЕНИТЬ Обновление для Swift:

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

Ответ 2

Здесь обновленный ответ для Swift 3, протестированный на Xcode 8 на основе ответа Marie Dm.

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

Ответ 3

Если DispatchQueue.main.sync вызвало раздавливание, попробуйте DispatchQueue.main.async. "async" работал для моей проблемы, возвращаясь из contactPicker().