Evite que UIAlertController descarte

Me gustaría evitar que el UIAlertController desestime.

Tengo una UIAlertAction que simplemente agrega una cadena al UIAlertTextField; sin embargo, una vez que se toca, descarta el controlador de vista [no deseado]. Intenté agregar una NSNotificación con resultados no deseados.

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

También intenté configurar no para pegar el mensaje por:

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

Editar, no estoy buscando evitar el toque de UIAlertAction . Estoy buscando evitar que el UIAlertController desestime al tocar en dicha acción. La acción se puede habilitar / deshabilitar, pero mi objective es simplemente pegar el mensaje copiado en UITextField presionando una acción (de ahí la razón por la que no quiero que se descarte)

También me di cuenta de configurar el BOOL para dismissViewControllerAnimated: simplemente lo configura para no animar el despido de los controladores de vista, no quiero que implique que fue para detener el proceso de despido. Simplemente ofreciendo las cosas que he probado en relación con mi objective. También intenté presentar un nuevo UIAlertController al seleccionar pasteMessage que rellena automáticamente el nuevo UIAlertControllers textField con el mensaje copiado, funciona, pero siento que es demasiado raro para lo que se podría hacer.

EDITAR:

Actualizado para Swift 3

Así que realmente logré que esto funcione. En resumen, se trata de agregar un reconocedor de gestos al UIAlertController que se activa antes de que se produzca el despido.

En primer lugar, crea variables calculadas cargadas de forma UIAlertController para su UIAlertController y la UIAlertAction que desea evitar que se UIAlertAction en su controlador de vista para que sean accesibles mediante el método selector del reconocedor de gestos (el self en el selector insinúa que todo esto está dentro de una vista controlador).

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

Asegúrese de que su reconocedor de gestos de arriba sea un UILongPressGestureRecognizer establecido con una duración mínima de prensa de 0. De esta forma puede acceder al estado del gesto (para cuando el usuario toque hacia abajo) antes de que la acción se desencadene por completo. Allí puede desactivar UIAlertAction , implementar su código personalizado y volver a habilitar la acción una vez que el gesto se haya completado (el usuario ha retocado). Vea abajo:

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

Entonces solo presenta el UIAlertController donde sea.

 @IBAction func showAlert(sender: AnyObject) { self.present(alert, animated: true, completion: nil) } 

Esto es obviamente un truco, pero no hay otra manera que yo sepa de lograr esto sin un truco, ya que no debe lograrse. Por ejemplo, el reconocedor de gestos está vinculado al UIAlertController por lo que el usuario puede activar ese método si toca en cualquier parte de la alerta (además del botón cancelar).

RESPUESTA ORIGINAL:

Esto es lo más cerca que pude llegar a un hackaround. Si hubiera alguna manera de personalizar el tiempo de transición de despido a nada, entonces podría establecer animated: a falso y se vería como la misma alerta, pero no creo que sea posible

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

Solo estoy familiarizado con swift

Casi la misma pregunta se responde aquí

El campo de texto en alerta admite la opción pegar, por lo que no hay una razón real para tener un botón por separado para alertar que indique la opción “pegar”.

De lo contrario, debería imitar a UIAlertController y volver a implementarlo con el comportamiento deseado.