2010-07-21 4 views
0

J'utilise Three20 et j'ai le mécanisme de recherche standard qui fonctionne.Three20 Search Scope

TTTableViewController* searchController = [[[TTTableViewController alloc] init] autorelease]; 
searchController.dataSource = [[[MyDataSource alloc] init] autorelease]; 
self.searchViewController = searchController; 
self.tableView.tableHeaderView = _searchController.searchBar; 

Je souhaite utiliser une étendue. mais j'ai de la difficulté à l'appliquer. En passant par le code Three20 il semble que le searchdisplaycontroller est déjà construit. Y at-il une méthode que je me manque comme

-(void)search:(NSString *)text withinScope:(NSString *)scope

Comment puis-je tirer le champ d'application de la searchdisplaycontroller? J'ai essayé d'utiliser les méthodes delegate pour le searchdisplaycontroller mais la source de données ne remplit pas la table.

Des idées?

Merci, Howie

Répondre

1

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