Il s'agit d'une vieille question. Je viens de rencontrer le même problème et j'ai réussi à le résoudre de la manière suivante :
Lorsque le searchBar:textDidChange:
de l'UISearchBarDelegate est appelée parce que l'utilisateur a appuyé sur le bouton "Effacer", la barre de recherche n'est pas encore devenue le premier intervenant. Nous pouvons donc en tirer parti afin de détecter si l'utilisateur avait en fait l'intention d'effacer la recherche et de ne pas mettre l'accent sur la barre de recherche et/ou de faire autre chose.
Pour en garder la trace, nous devons déclarer un fichier BOOL
dans notre viewController qui est aussi le délégué de la barre de recherche (appelons-le shouldBeginEditing
) et lui donner une valeur initiale de YES
(en supposant que notre classe viewController s'appelle SearchViewController) :
@interface SearchViewController : UIViewController <UISearchBarDelegate> {
// all of our ivar declarations go here...
BOOL shouldBeginEditing;
....
}
...
@end
@implementation SearchViewController
...
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
...
shouldBeginEditing = YES;
}
}
...
@end
Plus tard, dans le UISearchBarDelegate, nous implémentons la fonction searchBar:textDidChange:
y searchBarShouldBeginEditing:
méthodes :
- (void)searchBar:(UISearchBar *)bar textDidChange:(NSString *)searchText {
NSLog(@"searchBar:textDidChange: isFirstResponder: %i", [self.searchBar isFirstResponder]);
if(![searchBar isFirstResponder]) {
// user tapped the 'clear' button
shouldBeginEditing = NO;
// do whatever I want to happen when the user clears the search...
}
}
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)bar {
// reset the shouldBeginEditing BOOL ivar to YES, but first take its value and use it to return it from the method call
BOOL boolToReturn = shouldBeginEditing;
shouldBeginEditing = YES;
return boolToReturn;
}
En gros, c'est tout.
Best