¿Cómo get UITextField / UITextView y resignFirstResponder actualmente activos?

¿Es posible get el UITextField o UITextView actualmente activo en una UIView, por lo que puedo ocultar el keyboard con [text resignFirstResponder]; ?

A partir de iOS 2.0 y posteriores, hay una manera fácil de descartar el keyboard sin tener que rastrear el control actualmente activo, o repetir a través de todos los controles disponibles, o usar un UITextFieldDelegate .

 [self.view endEditing:YES] 

De los documentos:

fin de edición:

Hace que la vista (o uno de sus campos de text embeddeds) renuncie al estado del primer respondedor.

– ( BOOL ) endEditing 🙁 BOOL ) force

Parámetros
fuerza
Especifique YES para forzar la renuncia del primer respondedor, independientemente de si desea hacerlo.

Valor de retorno
YES si la vista renunció al estado del primer respondedor o NO si no lo hizo.

Discusión
Este método examina la vista actual y su jerarquía de subvista para el campo de text que actualmente es el primer respondedor. Si encuentra uno, le pide a ese campo de text que renuncie como primer respondedor. Si el parámetro force se establece en YES , el campo de text nunca se pregunta; se ve obligado a renunciar.

No hay forma de get directamente qué object es el primer respondedor actual (que conozco, al less) sin probarlos individualmente. Lo que puede hacer es crear un método que contenga todas las subvenciones que podrían ser el primer respondedor activo, de la siguiente manera:

 - (void)dismissKeyboard { if (myTextField1.isFirstResponder) { [myTextField1 resignFirstResponder]; } else if (myTextField2.isFirstResponder) { [myTextField2 resignFirstResponder]; } else if (myTextField3.isFirstResponder) { [myTextField3 resignFirstResponder]; } else if (myTextField4.isFirstResponder) { [myTextField4 resignFirstResponder]; } } 

En realidad, sin embargo, tiendo a hacerlo de esta manera, sin probar primero si una UIView particular es el primer respondedor actual, y no creo que haya ningún golpe / problema de performance apreciable (que de todos modos noté):

 - (void)dismissKeyboard { //Send resignFirstResponder message to all possible first responders... [myTextField1 resignFirstResponder]; [myTextField2 resignFirstResponder]; [myTextField3 resignFirstResponder]; [myTextField4 resignFirstResponder]; } 

Espero que ayude…

Este código rápido funciona para encontrar el primer respondedor:

 func findActiveResponderFrame(view:UIView)->UIView?{ if view.isFirstResponder() { return view } else { for sub in view.subviews { if let subView = sub as? UIView, found = findActiveResponderFrame(subView){ return found } } } return nil } 

Puede seguir si específicamente desea search el campo de text de respuesta. Obtenga la primera respuesta actual sin usar una API privada

también puede usar el siguiente código si solo desea descartar el keyboard de campo de text activo:

 - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } 

Actualización para Swift 3

Esta function oculta el keyboard de cualquier campo de text activo en Swift 3:

 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { self.view.endEditing(true) }