Как предотвратить закрытие UIAlertController при нажатии кнопки действия? [Дубликат]

Давайте посмотрим на лес сначала, прежде чем смотреть на деревья.

Здесь есть много информативных ответов с большими подробностями, я не буду повторять ни одного из них. Ключ к программированию в JavaScript имеет сначала правильную ментальную модель общего исполнения.

  1. Ваша точка входа (ов) выполняется в результате события. Например, в браузер загружается тег сценария с кодом. (Соответственно, поэтому вам, возможно, придется заботиться о готовности страницы запускать ваш код, если он требует, чтобы элементы dom были сконструированы первыми и т. Д.)
  2. Ваш код выполняется до завершения, однако многие асинхронные вызовы, которые он делает, без выполнения каких-либо ваших обратных вызовов, включая запросы XHR, установку тайм-аутов, обработчиков событий dom и т. д. Каждый из этих обратных вызовов, ожидающих выполнения, будет находиться в очереди, ожидая, что их очередь будет запущена после других событий
  3. Каждый отдельный обратный вызов XHR-запроса, установленного таймаута или dom события после вызова будет завершен.

Хорошие новости заключается в том, что, если вы хорошо понимаете этот момент, вам никогда не придется беспокоиться о гоночных условиях. Прежде всего вы должны понимать, как вы хотите упорядочить свой код как по существу ответ на разные дискретные события, и как вы хотите объединить их в логическую последовательность. Вы можете использовать обещания или новые асинхронные / ожидающие более высокие уровни в качестве инструментов для этой цели, или вы можете откатывать свои собственные.

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

24
задан soulshined 10 March 2015 в 05:50
поделиться

2 ответа

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 'только знаком с быстрым

21
ответ дан Aaron 24 August 2018 в 01:53
поделиться

Ответ на тот же вопрос здесь

Текстовое поле в режиме оповещения поддерживает параметр вставки, поэтому нет реальной причины иметь отдельную кнопку в предупреждении, чтобы указать «вставить», option.

В противном случае вы должны имитировать UIAlertController и переопределить его с помощью поведения желания.

0
ответ дан Community 24 August 2018 в 01:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: