Давайте посмотрим на лес сначала, прежде чем смотреть на деревья.
Здесь есть много информативных ответов с большими подробностями, я не буду повторять ни одного из них. Ключ к программированию в JavaScript имеет сначала правильную ментальную модель общего исполнения.
Хорошие новости заключается в том, что, если вы хорошо понимаете этот момент, вам никогда не придется беспокоиться о гоночных условиях. Прежде всего вы должны понимать, как вы хотите упорядочить свой код как по существу ответ на разные дискретные события, и как вы хотите объединить их в логическую последовательность. Вы можете использовать обещания или новые асинхронные / ожидающие более высокие уровни в качестве инструментов для этой цели, или вы можете откатывать свои собственные.
Но вы не должны использовать какие-либо тактические инструменты для решения проблемы, пока вам не понравится актуальная проблемная область. Нарисуйте карту этих зависимостей, чтобы знать, что нужно запускать, когда. Попытка ad-hoc подхода ко всем этим обратным вызовам просто не поможет вам.
EDIT:
Обновлено для Swift 3
Итак, я действительно получил это, чтобы работать. Короче говоря, это связано с добавлением распознавателя жестов к UIAlertController
, который запускается до увольнения.
Сначала вы создаете лениво загруженные вычисленные переменные для ваших UIAlertController
и UIAlertAction
, которые вы хотите предотвратить от запуска на вашем контроллере просмотра, чтобы они были доступны с помощью селекторного метода распознавателя жестов (self
в селекторе указывает, что все это находится внутри контроллера вида).
lazy var alert: UIAlertController = {
let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert)
alert.addTextField(configurationHandler: nil)
let appendAction = self.appendAction
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
alert.addAction(appendAction)
alert.addAction(cancelAction)
let gestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(self.append(sender:)))
gestureRecognizer.minimumPressDuration = 0.0
alert.view.addGestureRecognizer(gestureRecognizer)
return alert
}()
lazy var appendAction: UIAlertAction = {
return UIAlertAction(title: "Paste Message", style: .default, handler: nil)
}()
Убедитесь, что ваш распознаватель жестов выше - это UILongPressGestureRecognizer
набор с минимальной продолжительностью нажатия 0. Таким образом вы можете получить доступ к состоянию жестов (когда пользователь прикасается вниз) до того, как действие будет полностью запущено. Там вы можете отключить UIAlertAction
, реализовать свой собственный код и повторно активировать действие после того, как жест завершен (пользователь коснулся). См. Ниже:
@objc func append(sender: UILongPressGestureRecognizer) {
if sender.state == .began {
appendAction.isEnabled = false
} else if sender.state == .ended {
// Do whatever you want with the alert text fields
print(alert.textFields![0].text)
appendAction.isEnabled = true
}
}
Затем вы просто представляете UIAlertController
где угодно.
@IBAction func showAlert(sender: AnyObject) {
self.present(alert, animated: true, completion: nil)
}
Это, очевидно, взлом, но другого способа, который я знаю, без взлома, поскольку это не должно быть достигнуто. Например, распознаватель жестов привязан к UIAlertController
, поэтому пользователь может вызвать этот метод, если он нажимает в любом месте предупреждения (кроме кнопки отмены).
ОРИГИНАЛЬНЫЙ ОТВЕТ:
Это так близко, как я мог прийти к обману. Если бы какой-то способ настроить время перехода на уступки ни к чему, вы могли бы установить animated:
в false, и это будет похоже на одно и то же предупреждение, но я не думаю, что это возможно
class ViewController: UIViewController {
@IBAction func alert(sender: AnyObject) {
let alert = UIAlertController(title: "title", message: "message", preferredStyle: .Alert)
alert.addTextFieldWithConfigurationHandler(nil)
let appendAction = UIAlertAction(title: "Append text", style: .Default) { _ in
var textField = alert.textFields![0] as UITextField
// Append text here
self.presentViewController(alert, animated: true, completion: nil)
}
let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)
alert.addAction(appendAction)
alert.addAction(cancelAction)
self.presentViewController(alert, animated: true, completion: nil)
}
}
I 'только знаком с быстрым
Ответ на тот же вопрос здесь
Текстовое поле в режиме оповещения поддерживает параметр вставки, поэтому нет реальной причины иметь отдельную кнопку в предупреждении, чтобы указать «вставить», option.
В противном случае вы должны имитировать UIAlertController и переопределить его с помощью поведения желания.