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, 4 meses, 29 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 devolvemos false 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