Подтвердить что ты не робот

Предотвращение отклонения UIAlertController

Я хотел бы предотвратить отклонение UIAlertController.

У меня есть UIAlertAction, который просто добавляет строку в UIAlertTextField, однако после того, как он постучал, он отклоняет контроллер вида [нежелательно]. Я попытался добавить NSNotification с нежелательными результатами.

    UIAlertAction *pasteMessage = [UIAlertAction actionWithTitle:@"Paste Message" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
        UITextField *textField = alertC.textFields.firstObject;
        textField.text = [textField.text stringByAppendingString:[NSString stringWithFormat:@"%@", copiedString]];
    }];

Я также попытался установить no для вставкиMessage:

 [alertC canPerformAction:@selector(dismissViewControllerAnimated:completion:) withSender:pasteMessage];

-(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion {
    UIAlertController *alertController = (UIAlertController *)self.presentedViewController;
    UIAlertAction *paste = alertController.actions.firstObject;
       if (paste) {
         flag = NO;
       } else {
         flag = YES;
       }
 }

Изменить, я не хочу предотвращать нажатие UIAlertAction. Я хочу предотвратить отклонение UIAlertController при нажатии на указанное действие. Действие может быть включено/отключено, но моя цель - просто вставить скопированное сообщение в UITextField, нажав на действие (следовательно, причина, по которой я не хочу, чтобы он был уволен)

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

4b9b3361

Ответ 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)
    }
}

Я знаком с быстрым

Ответ 2

Совсем тот же вопрос отвечает здесь

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

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