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.