После тщательного поиска я пришел к выводу, что чего-то не хватает в основной библиотеке 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, когда я создаю экземпляр контроллера поиска в моем контроллере tableview, чтобы он ждал пару секунд перед выполнением поиска, когда пользователь вводит. Это полезно, поскольку мой поиск запрашивает сервер, и вместо того, чтобы отправлять каждый символ по мере того, как пользователь вводит, имеет смысл позволить им сначала ввести несколько символов.
Надеюсь это поможет.
Хауи
person
Ward
schedule
22.07.2010