Après une recherche haute et basse, je suis venu à la conclusion que quelque chose doit être absent de la bibliothèque Three20 de base. J'ai fait un peu de fouiner autour et constaté que les méthodes UISearchDisplayDelegate sont dans TTSearchDisplayController.m et malheureusement n'incorporent pas la portée quand ils remettent des choses à la source de données.
Voici les modifications que j'ai fait:
///////////////////////////////////////////////////////////////////////////////////////////////////
- (void)searchAfterPause {
_pauseTimer=nil;
// HOWIE MOD
if([self.searchBar.scopeButtonTitlescount])
{
NSString*scope = [[self.searchBarscopeButtonTitles]objectAtIndex:[self.searchBarselectedScopeButtonIndex]];
//NSLog(@"sending text: %@ for scope: %@", self.searchBar.text, scope);
[_searchResultsViewController.dataSource search:self.searchBar.textwithinScope:scope];
}else
{
[_searchResultsViewController.dataSource search:self.searchBar.text];
}
/*
// Original
[_searchResultsViewController.dataSource search:self.searchBar.text];
*/
// /HOWIE MOD
}
et
///////////////////////////////////////////////////////////////////////////////////////////////////
- (BOOL)searchDisplayController:(UISearchDisplayController*)controller
shouldReloadTableForSearchString:(NSString*)searchString {
if(_pausesBeforeSearching) {
[selfrestartPauseTimer];
} else{
// HOWIE MOD
if([self.searchBar.scopeButtonTitlescount])
{
NSString*scope = [[self.searchBarscopeButtonTitles]objectAtIndex:[self.searchBarselectedScopeButtonIndex]];
[_searchResultsViewController.dataSource search:searchString withinScope:scope];
returnYES;
} else
{
[_searchResultsViewController.dataSource search:searchString];
}
/*
// Original
[_searchResultsViewController.dataSource search:searchString];
*/
///HOWIE MOD
}
returnNO;
}
et
///////////////////////////////////////////////////////////////////////////////////////////////////
- (BOOL)searchDisplayController:(UISearchDisplayController*)controller
shouldReloadTableForSearchScope:(NSInteger)searchOption {
// HOWIE MOD
if([self.searchBar.scopeButtonTitlescount])
{
NSString*scope = [[self.searchBarscopeButtonTitles] objectAtIndex:searchOption];
[_searchResultsViewController.dataSource search:self.searchBar.textwithinScope:scope];
returnYES;
}else
{
[_searchResultsViewControllerinvalidateModel];
[_searchResultsViewController.dataSource search:self.searchBar.text];
}
/*
// Original
[_searchResultsViewController invalidateModel];
[_searchResultsViewController.dataSource search:self.searchBar.text];
*/
///HOWIE MOD
returnNO;
}
Puis j'ajouté ce qui suit à TTTableViewDataSource.h
// HOWIE MOD
- (void)search:(NSString*)text withinScope:(NSString*)scope;
// /HOWIE MOD
Et ce qui suit à TTTableViewDataSource.m
// HOWIE MOD
///////////////////////////////////////////////////////////////////////////////////////////////////
- (void)search:(NSString*)text withinScope:(NSString*)scope {
}
// /HOWIE MOD
Maintenant, je peux créer la méthode - (void) recherche: (NSString *) Texte withinScope: (NSString *) portée dans ma source de données et il répondra en conséquence, une recherche avec portée est effectuée. J'ai également activé pausesBeforeSearching lorsque j'instancie le contrôleur de recherche dans mon contrôleur tableview de sorte qu'il attend quelques secondes avant d'effectuer la recherche en tant que type d'utilisateur. Ceci est utile car ma recherche interroge un serveur et plutôt que d'envoyer chaque caractère au fur et à mesure que l'utilisateur tape, il est plus logique de les laisser d'abord taper quelques caractères.
Espérons que cela aide.
Howie