2009-05-29 17 views
35

Tengo una UISearchBar en mi interfaz y quiero personalizar el comportamiento del pequeño botón claro que aparece en la barra de búsqueda después de haber ingresado un texto (es un pequeño círculo gris con una cruz, aparece en el lado derecho del campo de búsqueda).¿Puedo conectar el botón Borrar de UISearchBar?

Básicamente, quiero que no solo borre el texto de la barra de búsqueda (que es la implementación predeterminada) sino que también borre algunas otras cosas de mi interfaz, pero llamando a uno de mis propios métodos.

No encuentro nada en los documentos para la clase UISearchBar o el protocolo UISearchBarDelegate; no parece que pueda obtener acceso directo a este comportamiento.

Lo único que hice fue nota de que los documentos explican que el método delegado:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText; 

se llama después se pulsa el botón de limpieza.

Inicialmente escribí un código en ese método que marcaba la propiedad de texto de la barra de búsqueda, y si estaba vacía, entonces se había borrado y para hacer todas mis otras cosas.

Dos problemas que esto, sin embargo:

En primer lugar, por alguna razón no puedo comprender, a pesar de que le digo a la barra de búsqueda para resignFirstResponder al final de mi método, algo, en alguna parte está fijando de nuevo a becomeFirstResponder. Realmente molesto ...

En segundo lugar, si el usuario no usa el botón borrar y simplemente borra el texto en la barra con el botón Eliminar en el teclado, este método se desactiva y los resultados de búsqueda desaparecen. No está bien.

¡Cualquier consejo o sugerencia en la dirección correcta sería genial!

Gracias!

Respuesta

1

Sugeriría utilizar los métodos rightView y rightViewMode de UITextField para crear su propio botón borrar que utiliza la misma imagen. Supongo, por supuesto, que UISearchBar te permitirá acceder al UITextField dentro de él. Creo que lo hará.
ser consciente de esto desde la Biblioteca de Referencia iPhone OS:

If an overlay view overlaps the clear button, however, the clear button always takes precedence in receiving events. By default, the right overlay view does overlap the clear button.

por lo que probablemente también tienen que desactivar el botón original, claro.

+1

estoy bastante seguro de que el UISearchBar no expone se texfield ... – Jasarien

7

Tengo este código en mi aplicación. La diferencia es que yo no apoyo 'búsqueda en tiempo real', pero en lugar de iniciar la búsqueda cuando el usuario toca el botón de búsqueda en el teclado:

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { 
    if ([searchBar.text isEqualToString:@""]) { 
     //Clear stuff here 
    } 
} 
+0

1 Estoy de acuerdo con esta respuesta. Si el texto está vacío, después de haber sido borrado, debe significar que se ha presionado el botón borrar. @Jasarien ¿Encontró una solución? – JoePasq

+0

Surley use - (void) searchBar: (UISearchBar *) searchBar textDidChange: (NSString *) searchText En su lugar, de lo contrario, si necesita resignar el primer respondedor, el usuario nunca podrá seleccionar el recuadro, ya que estará vacío cuando comiencen. – Marc

1

Dado que esto viene primero, y lo que he podido ver que la pregunta no era muy adecuada abordado, pensé que publicaría mi solución.

1) Necesita obtener una referencia al campo de texto dentro de la barra de búsqueda 2) Debe capturar ese texto Campo claro cuando se dispara.

Esto es bastante simple. Aquí hay una manera.

a) Asegúrese de hacer su clase a, ya que usará el método delegado de textField dentro de searchBar. b) Además, conecte su searchBar a un Outlet en su clase. Acabo de llamar a mi buscador Bar. c) desde viewDidLoad desea obtener el campo textField dentro de searchBar. Lo hice así.

UITextField *textField = [self.searchBar valueForKey:@"_searchField"]; 
if (textField) { 
    textField.delegate = self; 
    textField.tag = 1000; 
} 

Aviso, que asigna una etiqueta a la que textField para que pueda agarrarlo de nuevo, y me hizo un delegado textField. Podrías haber creado una propiedad y asignarle este campo de texto a esa propiedad para tomarla más tarde, pero utilicé una etiqueta.

Desde aquí sólo tiene que llamar al método delegado:

-(BOOL)textFieldShouldClear:(UITextField *)textField { 
if (textField.tag == 1000) { 
    // do something 
    return YES; 
} 
return NO; 

}

Eso es todo. Como se refiere a un valor privado para Key, no puedo garantizar que no lo meta en problemas.

+1

Muchas gracias amigo – SampathKumar

0

mejor solución desde mi experiencia es sólo para poner un UIButton (con fondo claro y no hay texto) por encima del botón de limpieza del sistema y de conectar un IBAction

- (IBAction)searchCancelButtonPressed:(id)sender { 

    [self.searchBar resignFirstResponder]; 
    self.searchBar.text = @""; 

    // some of my stuff 
    self.model.fastSearchText = nil; 
    [self.model fetchData]; 
    [self reloadTableViewAnimated:NO]; 

} 
17

encontrado la mejor solución para este problema :)

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ 
    if ([searchText length] == 0) { 
     [self performSelector:@selector(hideKeyboardWithSearchBar:) withObject:searchBar afterDelay:0]; 
    } 
} 

- (void)hideKeyboardWithSearchBar:(UISearchBar *)searchBar{ 
    [searchBar resignFirstResponder]; 
} 
+0

Tnx buen truco, agregué la versión Swift 2 como respuesta debajo de – ergunkocak

1

Usted podría intentar esto:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    for (UIView *view in searchBar.subviews){ 
     for (UITextField *tf in view.subviews) { 
      if ([tf isKindOfClass: [UITextField class]]) { 
       tf.delegate = self; 
       break; 
      } 
     } 
    } 
} 

- (BOOL)textFieldShouldClear:(UITextField *)textField { 
    // your code 
    return YES; 
} 
+2

No funciona para mí en iOS 9 con Swift 2. Bloqueos con error '_searchController]: selector no reconocido enviado a instancia' – Sunkas

0

no fue capaz de aleta d una solución aquí que no usaba una API privada o no era una prueba de actualización en caso de que Apple cambie la estructura de vista de UISearchBar. Esto es lo que escribí que funciona:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UITextField* textfield = [self findTextFieldInside:self.searchBar]; 
    [textfield setDelegate:self]; 
} 

- (UITextField*)findTextFieldInside:(id)mainView { 
    for (id view in [mainView subviews]) { 
     if ([view isKindOfClass:[UITextField class]]) { 
      return view; 
     } 

     id subview = [self findTextFieldInside:view]; 
     if (subview != nil) { 
      return subview; 
     } 
    } 

    return nil; 
} 

luego implementar el protocolo UITextFieldDelegate en su clase y sobrescribir los textFieldShouldClear: método.

- (BOOL)textFieldShouldClear:(UITextField*)textField { 
    // Put your code in here. 
    return YES; 
} 

Editar: Ajuste del delegado en el campo de texto de una barra de búsqueda en iOS8 producirá un choque. Sin embargo, parece que se llamará al método searchBar: textDidChange: en iOS8 en clear.

6

manejo de cerca de teclado en el botón clara clic versión Swift:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { 
    if searchText.characters.count == 0 { 
     performSelector("hideKeyboardWithSearchBar:", withObject:searchBar, afterDelay:0) 
    } 
} 

func hideKeyboardWithSearchBar(bar:UISearchBar) { 
    bar.resignFirstResponder() 
} 
Cuestiones relacionadas