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にデリゲートメソッドを使用しようとしましたが、データソースがテーブルにデータを入力していません。

何か案は?

ありがとう、Howie

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 に答える