2009-05-20 16 views
14

No estoy seguro de por qué es tan difícil. Tengo una UISearchBar en la parte superior de mi página. Cuando el usuario escribe en ese UISearchBar, filtrará automáticamente los resultados en UITableView que se encuentra debajo de la barra de búsqueda. No hay necesidad de un botón de búsqueda ya que busco cuando se presionan las teclas.Ocultar el teclado al perder el foco de UISearchBar

El flujo de la aplicación es que el usuario escribe una búsqueda en la barra de búsqueda (con el teclado visualizado) y luego desplazará los resultados en la vista de tabla, en cuyo punto el teclado debe desaparecer.

Me está costando conseguir que desaparezca el teclado.

sé que tengo que hacer:

[searchBar resignFirstResponder]; 

para obtener el teclado a desaparecer, pero no puedo encontrar lo que necesito delegado para llevar a cabo esto. Quiero hacer esto tan pronto como el usuario toque la vista de tabla.

¿Alguna idea?

+0

Comprobar esto: http://stackoverflow.com/questions/7482266/resign-keyboard-when-losing-focus- on-uisearchbar – alternatiph

Respuesta

1

Es posible que desee hacerlo ya que lo hace Cydia (UI de embalaje con jailbreak) - hay un botón de búsqueda, y cuando presiona el botón de búsqueda, cierra el teclado. Los resultados aún se filtran mientras escribe para obtener una vista previa.

+1

Esto requeriría presionar el botón de búsqueda para quitar el teclado, un paso que creo que debería ser innecesario y podría frustrar a los usuarios. Gracias sin embargo. – rein

9

Prueba esto:

- (void)viewWillDisappear:(BOOL)animated { 

    [super viewWillDisappear:animated]; 

    [searchBar resignFirstResponder]; 

} 

Funcionó para mí

2

creo que la forma más fácil (y mejor) para hacer esto es subclase de su visión global y utilizar hitTest: Método withEvent a escuchar cualquier toque. Los toques en el teclado no están registrados, entonces hitTest: withEvent solo se invoca cuando toca/desliza/desliza/pellizca ... en otro lugar, y luego llama a [end end Editing: YES].

Esto es mejor que usar toques Comenzar porque no se llaman toques Bean si hace clic en un botón en la parte superior de la vista. También es mejor que usar una pantalla tenue porque en una interfaz de usuario compleja y dinámica, no se puede poner una pantalla tenue en todas partes. Además, es mejor que llamar a [searchBar resignFirstResponder], ya que puede tener muchos campos de texto en la pantalla, por lo que esto funciona para todos ellos.

0

Podría ser muy tarde para responder, pero esto podría ayudar a cualquier persona en el futuro. Esta pieza de código en particular funcionó para mí. PD No poseo esta solución, encontrada hace algún tiempo en la red misma.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
UITouch *touch = [[event allTouches] anyObject]; 
if ([self.srchBar isFirstResponder] && [touch view] != self.srchBar) 
{ 
    [self.srchBar resignFirstResponder]; 
} 
[super touchesBegan:touches withEvent:event]; 
} 
1

Dado que los resultados van a ser en una vista de tabla, utilice el método - (void)scrollViewDidScroll:(UIScrollView *)scrollViewUIScrollView 's delegado (a la que UITableView responde).

Usted necesita tener su vista controlador responde a la fuente UITableView 's de datos y delegado (en el archivo de .h):

<UITableViewDataSource, UITableViewDelegate> 

Que en su método de inicialización en el .m archivo de complemento:

self.tableView.dataSource = self; 
self.tableView.delegate = self; 

Por último, añadir este método:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    [self.view endEditing:YES]; 
} 

Esto hará que el UISearchBar pierda el foco, y el teclado se ocultará.

1

Una posibilidad es que UISearchBar pertenece a un controlador, que se muestra en UIModalPresentationFormSheet. Tuve el mismo problema y descubrí que esto está relacionado con el método "disableAutomaticKeyboardDismissal" de UIViewController.

Los Apple documentation indica lo siguiente:

reemplazar este método en una subclase para permitir o no permitir el despido de la vista de entrada actual (por lo general el teclado del sistema) cuando se cambia de un control que quiere la entrada ver a uno que no. En circunstancias normales, cuando el usuario toca un control que requiere una vista de entrada , el sistema muestra automáticamente esa vista. Al tocar en un control que no quiere una vista de entrada, posteriormente se descarta la vista de entrada actual , pero puede que no en todos los casos. Puede anular este método en aquellos casos pendientes para permitir que la entrada vista sea descartada o utilizar este método para evitar que la vista sea descartada en otros casos.

La implementación predeterminada de este método devuelve SÍ cuando el estilo de presentación modal del controlador de vista está establecido en UIModalPresentationFormSheet y devuelve NO para otros estilos de presentación . Por lo tanto, el sistema normalmente no permite que el teclado sea descartado para formularios modales.

En mi caso, se muestra la barra de búsqueda en la barra de navegación, así que tuve que crear una subclase de UINavigationViewController que reemplaza el método de la siguiente forma:

- (BOOL)disablesAutomaticKeyboardDismissal { 
    return NO; 
} 

Después de eso resignFirstResponder finalmente realizar la el teclado desaparecerá

0

Dada una vista con una variable searchBar, añadir este método a la vista:

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? 
{ 
    if searchBar.isFirstResponder && !searchBar.point(inside: point, with: event){ 
     searchBar.resignFirstResponder() 
    } 
    return super.hitTest(point, with: event) 
} 
Cuestiones relacionadas