2011-12-04 14 views
15

Tengo una vista de tabla en una hoja de formulario modal (iPad), y una de las celdas contiene un UITextField. Mi controlador de vista contiene una referencia al campo de texto y también es su delegado.El teclado de UITextField no se cerrará. No, realmente

Cuando el campo de texto golpea Volver, lo digo a -resignFirstResponder dentro de -textFieldShouldReturn:. En otro caso, quiero obligarlo a finalizar la edición, por lo que le digo a toda la vista de tabla al -endEditing:YES. Después, publico mi referencia local al campo de texto y vuelvo a cargar la fila para reemplazarla por otra cosa.

El teclado no desaparecerá en ningún caso. No sé lo que está mal, y no estoy seguro de cómo seguir depurando. Nunca he tenido un problema de teclado adhesivo con ninguna otra edición de texto que he hecho, la primera resignación de Responsor siempre se ha comportado como se esperaba.

¿Alguna idea? Gracias.

+0

¿Se ejecuta el código? ¿Llamas a resignFirstResponder en el campo de texto correcto? – Eiko

+0

Sí. Me aseguré de que 'isFirstResponder' sea SÍ en el campo de texto al que llamo' -resignFirstResponder' inmediatamente antes de llamarlo. –

Respuesta

11

Implemente -disablesAutomaticKeyboardDismissal y devuelva NO. Es funciona en iOS 6, pero tiene que implementarlo en el controlador adecuado. Si tiene un controlador de navegación modal de hoja de formulario con un controlador secundario que tiene campos de texto, es el controlador de navegación el que necesita la implementación del método, no el niño.

(Ver también Dismiss keyboard on IPAD)

+0

¡Oh sí! Finalmente resolvió esto para mí. Recuerde configurar esto en el controlador de vista que presenta el controlador de vista que contiene el campo de texto. –

21

Los documentos de Apple describe this exception:

En el IPAD, si una forma modal controlador de vista presenta su punto de vista con el estilo "forma de hoja", el teclado, una vez que se muestra, no se podrá ver hasta los grifos de usuarios la clave de descarte o el controlador de vista modal es desestimado programáticamente. El propósito de este comportamiento es evitar las animaciones excesivas de a medida que un usuario se mueve entre vistas que son en gran medida, pero no del todo, campos de texto.

Lo que ocurre al aplicar aquí (formulario modal en iPad). Aparentemente no es posible descartar el teclado en este caso. Súper. : \

+1

+1: Acabo de encontrar esta respuesta después de sacar mi cabello por una hora tratando de resolver esto. y la respuesta es Apple ¿Hizo esta implementación idiota EN PROPÓSITO? tienes que estar bromeando con Apple. –

+9

Puede anular el método 'disableAutomaticKeyboardDismissal' y devolver NO para el controlador de vista que se presenta de forma modal. Esto funcionará en torno al comportamiento predeterminado de evitar que el teclado se cierre. – gdavis

+1

Desafortunadamente, la corrección disablesAutomaticKeyboardDismissal parece haber dejado de funcionar con iOS 6. ¿Alguien más está viendo lo mismo? – Snips

1

Desde la anulación disablesAutomaticKeyboardDismissal no está trabajando en iOS 6, que tenía que conectar el evento de cada campo de texto "puso fin al salir" a un método y luego ocultar el teclado no, así:

- (IBAction)doneEditing:(id)sender { 

[sender endEditing:YES]; 

}

0

El disablesAutomaticKeyboardDismissal se negaron a trabajar para mí en iOS 7.

... Pero me las arreglé para resolver este problema simplemente desactivando los UITextFields en la pantalla.

Mi solución se describe here.

Esto incluso funciona en Modal UIViewController s.

0

Acabo de encontrar una situación única donde esto ocurre. Tengo una opinión de que cuando se descarta deja el teclado en la pantalla. Comprobé todo, mis delegados UITextFields se conectaron a mi vista, etc. Intentar cerrar el teclado manualmente en viewWillDisappear() no funcionaría, ya sea por resignFirstResponder() en los campos o endEditing() en la vista.

Luego me di cuenta de que era mi código de validación de campo en los métodos de delegado en sí. Cada vez que finalizaba la edición en un campo, valido el texto en el método de delegado textFieldShouldEndEditing para garantizar que el texto sea razonable, muy parecido a esto, y no les permite salir del campo hasta que se valida.

func textFieldShouldEndEditing(textField: UITextField) -> Bool 
    { 
     if self.validateField(textField) { 
      return true 
     } else { 
      return false 
     } 
    } 

Así que cuando un usuario vuelve a la vista anterior sin introducir ningún texto, la validación falla, el campo de texto no se permite renunciar a su primer estado de respuesta, y el teclado permanece en la pantalla, ya que volver a la anterior ver.

Es una situación inusual, pero espero que esto ayude a alguien más que se encuentre con ella.

+1

o simplemente 'return self.validateField (textField)' – Alnitak

0

en Swift acaba de dar su UITextField un delegado y generar textFieldShouldReturn(), véase más adelante, por ejemplo -

class ViewController: UIViewController, UITextFieldDelegate { 
    func settingUpTextField() { 
     textField.delegate = self; 
     return; 
    } 
    ... 
    func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
     textField.resignFirstResponder(); 
     return true; 
    } 
} 

hecho!

Cuestiones relacionadas