2011-05-14 16 views
13

Tengo un UIViewController que es un UISearchBarDelegate y un MKMapViewDelegate. El evento searchBarSearchButtonClicked funciona bien, pero cuando se prueba en iOS 4.2 el searchBarCancelButtonClicked nunca se llama al presionar el botón cancelar. En 4.3 todo funciona bien. Tengo otras vistas con código idéntico y funciona bien. He comprobado tres veces las firmas del método.El delegado de UISearchBar no responde al botón cancelar

¿Podría ser algo relacionado con MapView, o estoy haciendo algo descaradamente mal?

Mi archivo .h:

@interface MyViewController : UIViewController <UISearchBarDelegate,MKMapViewDelegate,UIAlertViewDelegate>{ 
MKMapView *mapMainView; 
UISearchBar *sBar; 

} 

@property (nonatomic, retain) UISearchBar *sBar; 
@end 

Y creo la barra de búsqueda de este modo:

sBar = [[[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320.0, 70.0)] autorelease]; 
sBar.delegate = self; 
sBar.showsCancelButton = YES; 
[self.view addSubview:sBar]; 
[sBar becomeFirstResponder]; 

El método:

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar 
{ 
[searchBar resignFirstResponder]; 
searchBar.hidden = YES; 
} 

¿Alguien tiene una idea de por qué esto puede estar sucediendo?

+0

Una cosa que acabo de notar: si toco y mantengo presionado el botón Cancelar durante más de 3 segundos, funciona ... ¿alguna idea? – user213517

+1

Suena como un error de marco. ¿Podrías subir un .xcproj mínimo para que yo pueda ver lo que está pasando? –

Respuesta

4

Probablemente su objeto sbar se está liberando, en este caso es un objeto de liberación automática, ¿Por qué? Intente declarar sBar como la propiedad IBOutlet. Cree los enlaces adecuados en Interface Builder, elimine la asignación como la codifica, ponga en viewDidUnload self.sbar = nil; y libérelo en dealloc. en viewDidLoad pon esto.

sBar.delegate = self; 
sBar.showsCancelButton = YES; // this is an option in object inspector 
[self.view addSubview:sBar]; 
[sBar becomeFirstResponder]; //remove this. 

Dime si funciona

+0

Sí, lo intenté ya, no hay dados. El caso es que funciona bien en otras pantallas de controlador de vista y funciona en iOS 4.3. Además, como publiqué antes, mantener presionado el botón de cancelar durante unos segundos hace que funcione. – user213517

1

intente esto:

sBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320.0, 70.0)]; 

sBar.delegate = self; 

sBar.showsCancelButton = YES; 

[self.view addSubview:sBar]; 

e intenta poner lanzamiento en dealloc

21

que tenía el mismo problema. Manteniendo presionado el botón de cancelar por unos segundos trabajó.

La razón para mí fue que había implementado UITapGestureRecognizer en la tabla vista. De modo que esto tuvo prioridad sobre el clic del botón o sobre el botón 'x' en la barra de búsqueda.

La solución en mi caso era restringir el reconocimiento de gestos a solo la vista de fondo de la tabla. Supongo que algo similar podría estar sucediendo en tu caso. Intente restringir los reconocedores de gestos a la subvista mínima requerida y la barra de búsqueda debe estar fuera de esa vista.

+0

¡Gran respuesta, muchas gracias! – derpoliuk

+0

Gracias. Este fue exactamente mi problema. Tenía una vista de colección. Restringí el gesto de tap a la vista de fondo y funcionó. Gracias de nuevo. – Isuru

+1

No tengo ningún reconocedor de gestos adicional y el botón Cancelar aún no desencadena su método de delegado como debería. Aunque tocar y mantener funcionaba para mí, no puedo confiar en este comportamiento. Gracias por la pista de todos modos :-) +1 – jweyrich

1
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (tableView == self.searchDisplayController.searchResultsTableView) 
    { 
     [self.searchDisplayController setActive:NO animated:YES]; 
     [self.searchDisplayController.searchBar resignFirstResponder]; 
    } 
} 
+0

Thnx @Mazen Kasser –

Cuestiones relacionadas