2012-01-22 21 views

Respuesta

27

a partir de iOS 2.0 y luego, hay una manera fácil de descartar el teclado sin hav para rastrear el control actualmente activo, o iterar a través de todos los controles disponibles, o usar un UITextFieldDelegate.

[self.view endEditing:YES] 

A partir de los documentos:

endEditing:

que la vista (o uno de sus campos de texto incrustados) a dimisión el primer estado que responde.

- (BOOL) endEditing :(BOOL) fuerza

Parámetros
fuerza
Especificar YES para forzar al primer nivel de respuesta a renunciar, sin importar si se quiere hacer de manera .

Valor de retorno
YES si la vista renunció el primer estado de respuesta o NO si no lo hizo.

Discusión
Este método se ve en la vista actual y su jerarquía subvista para el campo de texto que es actualmente el primer nivel de respuesta. Si encuentra uno, le pide que renuncie al campo de texto como primera respuesta. Si el parámetro force se establece en YES, el campo de texto nunca se pedirá; está obligado a renunciar.

0

Puede seguir si desea buscar específicamente el campo de texto del respondedor. Get the current first responder without using a private API

también se puede utilizar siguiente código si solo deseas despedir campo de texto activo teclado-

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

¿Dónde debería colocar este código? – Tyilo

+0

Y esto no funcionaría con UITextView, ¿o sí? – Tyilo

+0

consulte lo siguiente para la vista de texto- http://stackoverflow.com/questions/703754/how-to-dismiss-keyboard-for-uitextview-with-return-key – rishi

5

No hay forma de llegar directamente qué objeto es el actual primer nivel de respuesta (que yo sepa, al menos) sin probarlos individualmente. Lo que puede hacer es crear un método que contiene todos los subvistas la que posiblemente podría ser el primero en responder 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, tienden a hacerlo de esta manera, sin antes comprobar si una determinada UIView es el actual primer nivel de respuesta, y no creo que haya ningún impacto en el rendimiento apreciable/tema (que me he dado cuenta de todos modos):

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

Espero que ayude ...

+2

Esto no es necesario, [self.view endEditing: YES] ; va a hacer –

5

Este código SWIFT trabaja en la búsqueda del primer nivel de respuesta:

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 
} 
0

Actualización para Swift 3

Esta función se esconde el teclado de cualquier campo de texto activo en Swift 3:

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