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()
.