2016-11-01 8 views
2

У меня были аналогичные проблемы в прошлом с UIAlertController в том смысле, что всегда существует отставание в потоке пользовательского интерфейса после отклонения UIAlertController.
Моя проблема прямо сейчас в том, что я хочу выполнить segue, если пользователь нажимает «ОК» UIAlertAction, и ничего не происходит, если нажата кнопка «Отменить» UIAlertAction.
Это мой код:Выполнение segue после отклонения UIAlertController

// create the uialertcontroller to display 
let alert = UIAlertController(title: "Do you need help?", 
           message: "Would you like to look for a consultant?", 
           preferredStyle: .alert) 
// add buttons 
let okay = UIAlertAction(title: "Yes, please.", style: .default, handler: {_ in 
    self.performSegue(withIdentifier: "segue", sender: nil) 
}) 
let no = UIAlertAction(title: "No, I'm okay.", style: .cancel, handler: nil) 
alert.addAction(okay) 
alert.addAction(no) 
self.present(alert, animated: true, completion: nil) 

Что сейчас происходит, когда я нажимаю «Хорошо» переход выполняет, но я могу видеть только последние моменты перехода (т.е. анимации начинается в то время как UIAlertController является увольнение).
Как мне начать старт после того, как UIAlertController уволен?

Примечание. Я предпочитаю не разрешать это в хакерском методе, например, выполнять сеанс после фиксированной задержки, если есть другой способ.

Спасибо!

+0

@ Matt так что на самом деле не способ делать это, если я оживить после 'n' секунд? Также - нет, где я сказал, запрещаю – uti0mnia

ответ

3

Проблема в этом коде:

let okay = UIAlertAction(title: "Yes, please.", style: .default, handler: {_ in 
    self.performSegue(withIdentifier: "segue", sender: nil) 
}) 

handler: не завершение обработчика. Он работает до предупреждение (автоматически) отклонено. Таким образом, вы начинаете segue, пока предупреждение все еще присутствует.

Если вы предпочитаете не использовать delay (хотя я не вижу ничего плохого в таком подходе), что я хотел бы попробовать это:

let okay = UIAlertAction(title: "Yes, please.", style: .default, handler: {_ in 
    CATransaction.setCompletionBlock({ 
     self.performSegue(withIdentifier: "segue", sender: nil) 
    }) 
}) 
+0

Я понял - есть ли способ выполнить это после того, как контроллер уволен? – uti0mnia

+0

Как я тебе не говорил? Если вы ссылаетесь на мою заметку, это просто означает, что я, конечно, предпочитаю метод, который не имеет статической отправки после времени :) – uti0mnia

+0

Ответ на fyour не содержит отправки после этого, поэтому я не понимаю, почему вам нужно учиться хорошее решение несправедливо? – uti0mnia