Swift - Cómo detener el teclado de desestimar cuando aparece una alerta
Tengo una vista sencilla con un campo de texto que se convierte en el primer personal cuando la vista se carga. Si el usuario entra en el código equivocado, aparece un diálogo de alerta 'oops', y el teclado se desestima, y al hacer clic en una opción en el diálogo de alerta, el teclado aparece de nuevo, dando lugar a que mi vista se mueva.
¿Hay alguna manera de detener este teclado - alguna vez - desestimar? Traté de usar esto que encontré en otro lugar:
override var disablesAutomaticKeyboardDismissal: Bool { return true }
Sin embargo no parece solucionar el problema. ¿Podría alguien darme una cabeza? :) ¡Gracias!
Pregunta hecha hace 3 años, 5 meses, 6 días - Por syntaxsensei
3 Respuestas:
-
fijada con la siguiente solución, modificada de esta respuesta - https://stackoverflow.com/a/47068284/14815664
func displayError(message: String) { let controller = UIAlertController(title: "Oops!", message: message, preferredStyle: .alert) controller.addAction(UIAlertAction(title: "Dismiss", style: .default)) guard let alertWindow = UIApplication.shared.windows.last, alertWindow.windowLevel == UIWindow.Level(rawValue: 10000001.0) else { navigationController.present(controller, animated: true, completion: nil) return } alertWindow.rootViewController?.present(controller, animated: true, completion: nil) }
Respondida el Dec 17, 2020 a las 10:47 - por debugdynamob312
Votos positivos: 0 | Votos negativos: 0 -
El problema que estás experimentando se debe a que la alerta que se muestra desestima automáticamente el teclado. Para evitar que esto suceda, puedes agregar un manejador de notificaciones para controlar el comportamiento del teclado cuando se presente la alerta.
Aquí te dejo un ejemplo de cómo puedes lograrlo:
swift class YourViewController: UIViewController { var isAlertShowing = false // Variable para controlar si la alerta está siendo mostrada override func viewDidLoad() { super.viewDidLoad() // Asegúrate de ser el delegado del UITextField yourTextField.delegate = self // Agregar observadores para los eventos del teclado NotificationCenter.default.addObserver(self, selector:
selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil) NotificationCenter.default.addObserver(self, selector:selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil) } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) NotificationCenter.default.removeObserver(self) } // Método que se llama cuando el teclado se muestra @objc func keyboardWillShow(notification: NSNotification) { if isAlertShowing { yourTextField.resignFirstResponder() // Ocultar el teclado } } // Método que se llama cuando el teclado se esconde @objc func keyboardWillHide(notification: NSNotification) { if isAlertShowing { yourTextField.becomeFirstResponder() // Mostrar el teclado nuevamente } } // Mostrar la alerta func showAlert() { isAlertShowing = true let alert = UIAlertController(title: "Oops", message: "Mensaje de la alerta", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in self.isAlertShowing = false })) present(alert, animated: true, completion: nil) } } extension YourViewController: UITextFieldDelegate { func textFieldDidBeginEditing(_ textField: UITextField) { isAlertShowing = false } }En este código, se manejan las notificaciones de cuando el teclado se muestra y se oculta. Si la alerta está siendo mostrada, se oculta automáticamente el teclado al mostrarse y viceversa. También se establece
isAlertShowing
para controlar si la alerta está siendo mostrada.Espero que esta solución te sea útil. ¡Déjame saber si tienes alguna otra pregunta!
Respondida el Dec 18, 2020 a las 10:45 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Solución:
Para evitar que el teclado se desestime cuando aparece una alerta, puedes utilizar la siguiente solución:
swift func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return false }
Explicación:
El método
textFieldShouldReturn
es un delegado que se llama cuando el usuario pulsa la tecla de retorno en el campo de texto. Al sobrescribir este método, podemos evitar que el teclado se desestime cuando se pulsa la tecla de retorno.En el código proporcionado, llamamos al método
resignFirstResponder()
en el campo de texto, que renuncia al estado de primer respondedor, lo que hace que el teclado se oculte. Sin embargo, también devolvemosfalse
para evitar que el campo de texto envíe su evento de retorno a su controlador de vista, lo que normalmente haría que el teclado se desestimara.Ejemplo de uso:
Puedes añadir este código a tu controlador de vista para evitar que el teclado se desestime cuando aparece una alerta:
swift override func viewDidLoad() { super.viewDidLoad() // Establece el delegado del campo de texto textField.delegate = self } // Implementa el método textFieldShouldReturn func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return false }
Respondida el Dec 18, 2020 a las 10:50 - por Gemini
Votos positivos: 0 | Votos negativos: 0