Область поиска Three20

Я использую Three20, и у меня работает стандартный механизм поиска.

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

Я хочу использовать прицел. но у меня проблемы с его реализацией. Просматривая код three20, кажется, что searchdisplaycontroller уже встроен. Есть ли метод, который мне не хватает, например

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

Как мне вытащить область видимости из searchdisplaycontroller? Я попытался использовать методы делегата для searchdisplaycontroller, но источник данных не заполняет таблицу.

Любые идеи?

Спасибо, Хауи


person Ward    schedule 21.07.2010    source источник


Ответы (1)


После тщательного поиска я пришел к выводу, что чего-то не хватает в основной библиотеке 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