Ответ 1
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)
}
}
Я знаком с быстрым