Three20 Search Scope - PullRequest
       15

Three20 Search Scope

0 голосов
/ 22 июля 2010

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

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

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

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

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

Есть идеи?

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

1 Ответ

1 голос
/ 22 июля 2010

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

Надеюсь, это поможет.

Хови

...