2015-03-07 3 views
23

Я хочу предотвратить отклонение 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]]; 
    }]; 

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

[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; 
     } 
} 

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

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

+0

Возможный дубликат [Запретить увольнение UIAlertController] (http://stackoverflow.com/questions/25628000/prevent-dismissal-of-uialertcontroller) –

+0

Спасибо @LyndseyScott, что не является истинным решением моего вопроса. Это просто предотвращает включение кнопки на основе текстового поля с текстом в нем: вот их решение: '= (tf.text! =" ")', Который просто отключает кнопку от разрешения отклонения представления _eventually_ – soulshined

+0

Но я думаю наиболее важная часть этого ответа заключается в выборе 'UIAlertAction' * will * отклоняет ваше предупреждение. Если вам нужно другое поведение, попробуйте создать собственное собственное представление. –

ответ

21

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, поэтому пользователь может вызвать этот метод, если он нажимает в любом месте предупреждения (кроме кнопки отмены).

ОРИГИНАЛЬНЫЙ ОТВЕТ:

Это так близко, как я мог бы прийти к hackaround. Если есть какой-то способ, чтобы настроить время Увольнение перехода ни к чему, то вы можете установить animated: к ложным, и это будет выглядеть так же предупреждение, но я не думаю, что это возможно

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) 
    } 
} 

Я знакома только с скор

+0

Swift не беспокоится. Легко переводимый. Тем не менее, я не на компьютере, чтобы справиться с проблемой, но я уверен, что ваш код вызовет ошибку. Ваша попытка представить контроллер представления на том же, который уже существует. Кроме того, повторите свой комментарий о настройке анимации на false, см. Мое редактирование, которое я сделал ранее до вашего ответа, это был «обходной путь», который я сделал, но я не доволен этим как резолюция, поэтому я в конечном итоге спросил здесь – soulshined

+0

Я запускал код в симуляторе, и он работал нормально. Не видел твоих прав, мое плохое. – Aaron

+0

Ваш обходной путь был моей работой. Проголосуйте за усилия. Спасибо за ввод. Просто собираюсь создать свой собственный – soulshined

0

Практически тот же вопрос ответил here

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

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

+0

Это не тот вопрос. См. Мои комментарии выше. Этот вопрос предназначен для проверки текста. Мой вопрос - строго запретить увольнение. И есть реальная причина для моих обстоятельств. Просто потому, что есть параметр вставки, это не значит, что он помнит последние 10 паст. Он будет вставлять только то, что было скопировано последним в буфер обмена. Моя кнопка вставки - это синглтон, который запомнил приложение, не обращая внимания на вариант вставки iPhone (таким образом, пользователи могут использовать это, если захотят). Спасибо за вклад, хотя - лучше, чем ничего. – soulshined

Смежные вопросы