iphone - example - ¿Puedo conectar el botón Borrar de UISearchBar?
uisearchbardelegate (9)
Dado que esto aparece primero, y por lo que puedo ver, la pregunta no se trató adecuadamente, pensé en publicar mi solución.
1) Necesitas obtener una referencia al campo de texto dentro de la barra de búsqueda 2) Debes capturar ese texto claro cuando se dispara.
Esto es bastante simple. Aquí hay una manera.
a) Asegúrese de hacer que su clase sea a, ya que usará el método delegado de textField dentro de searchBar. b) Además, conecta tu searchBar a un Outlet en tu 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, le asigné una etiqueta a ese campo de texto para que pueda tomarlo de nuevo, y lo convertí en un delegado de campo de texto. 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í solo necesitas llamar al método de delegado:
-(BOOL)textFieldShouldClear:(UITextField *)textField {
if (textField.tag == 1000) {
// do something
return YES;
}
return NO;
}
Eso es. Como se refiere a un valor privado para Key, no puedo garantizar que no lo meta en problemas.
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 a la derecha) lado del campo de búsqueda).
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 puedo encontrar 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 noté fue que los documentos explicaban que el método de delegado:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText;
se invoca después de que se toca el botón borrar.
Inicialmente escribí un código en ese método que verificaba 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 entender, aunque le digo a la barra de búsqueda que resigneFirstResponder al final de mi método, algo, en algún lugar, lo está configurando de nuevo para convertirse en FirstResponder. Realmente molesto...
En segundo lugar, si el usuario no usa el botón borrar y simplemente elimina el texto en la barra usando 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!
Encontré 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];
}
La mejor solución de mi experiencia es simplemente poner un UIButton (con fondo claro y sin texto) encima del botón de borrado del sistema y luego 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];
}
La respuesta que fue aceptada es incorrecta. Esto se puede hacer, lo descubrí y lo publiqué en otra pregunta:
UISearchbar clearButton obliga al teclado a aparecer
Mejor
La versión Swift maneja el teclado cercano en el botón claro, haga clic en:
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
if searchText.characters.count == 0 {
performSelector("hideKeyboardWithSearchBar:", withObject:searchBar, afterDelay:0)
}
}
func hideKeyboardWithSearchBar(bar:UISearchBar) {
bar.resignFirstResponder()
}
No fue posible encontrar una solución aquí que no utilizara una API privada o no fuera 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, implemente el protocolo UITextFieldDelegate en su clase y sobrescriba el método textFieldShouldClear :.
- (BOOL)textFieldShouldClear:(UITextField*)textField {
// Put your code in here.
return YES;
}
Editar: Configurar el delegado en el campo de texto de una barra de búsqueda en iOS8 producirá un bloqueo. Sin embargo, parece que se llamará al método searchBar: textDidChange: en iOS8 en clear.
Puedes 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;
}
Sugeriría usar los métodos rightView
y rightViewMode
de UITextField para crear su propio botón de borrar que usa la misma imagen. Supongo, por supuesto, que UISearchBar te permitirá acceder al UITextField dentro de él. Creo que lo hará.
Tenga en cuenta esto desde la biblioteca de referencia de 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 tanto, probablemente también deba deshabilitar el botón borrar original.
Tengo este código en mi aplicación. La diferencia es que no soporto ''búsqueda en vivo'', sino que comienzo a buscar cuando el usuario toca el botón de búsqueda en el teclado:
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
if ([searchBar.text isEqualToString:@""]) {
//Clear stuff here
}
}