После поиска по максимуму и минимуму я пришел к выводу, что в базовой библиотеке Three20 что-то должно отсутствовать. Я немного покопался и обнаружил, что методы UISearchDisplayDelegate находятся в TTSearchDisplayController.m и, к сожалению, не включают в себя область действия, когда они передают данные в источник данных.
Вот модификации, которые я сделал:
///////////////////////////////////////////////////////////////////////////////////////////////////
- (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
}
и
///////////////////////////////////////////////////////////////////////////////////////////////////
- (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;
}
и
///////////////////////////////////////////////////////////////////////////////////////////////////
- (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;
}
Затем я добавил следующее в TTTableViewDataSource.h
// HOWIE MOD
- (void)search:(NSString*)text withinScope:(NSString*)scope;
// /HOWIE MOD
И следующее к TTTableViewDataSource.m
// HOWIE MOD
///////////////////////////////////////////////////////////////////////////////////////////////////
- (void)search:(NSString*)text withinScope:(NSString*)scope {
}
// /HOWIE MOD
Теперь я могу создать метод - (void) search: (NSString *) text WithinScope: (NSString *) scope в моем источнике данных, и он будет реагировать соответствующим образом при выполнении поиска с областью. Я также включил pausesBeforeSearching , когда я создаю экземпляр контроллера поиска в своем контроллере табличного представления, чтобы он подождал пару секунд, прежде чем выполнять поиск при вводе пользователем. Это полезно, поскольку мой поиск запрашивает сервер и вместо того, чтобы отправлять каждый символ по мере ввода пользователем текста, имеет больше смысла позволить им сначала набрать несколько символов.
Надеюсь, это поможет.
Хови