0

我正在使用 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 的委托方法,但数据源没有填充表。

有任何想法吗?

谢谢,豪伊

4

1 回答 1

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,它会在执行具有范围的搜索时做出相应的响应。当我在我的 tableview 控制器中实例化搜索控制器时,我还启用了 pausesBeforeSearching,以便它等待几秒钟,然后在用户键入时执行搜索。这很有帮助,因为我的搜索正在查询服务器,而不是在用户键入时发送每个字符,让他们先键入几个字符更有意义。

希望这可以帮助。

豪伊

于 2010-07-22T11:58:27.827 回答