6

私のアプリはUISearchDisplayController. ユーザーが検索語を入力したときに、検索バーに表示されたままにしたい。これは、ユーザーが一致した結果の 1 つを選択した場合には機能しますが、ユーザーが [検索] ボタンをクリックした場合には機能しません。

これは機能します:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        NSString *selectedMatch = [self.searchMatches objectAtIndex:indexPath.row];
        [self.searchDisplayController setActive:NO animated:YES];
        [self.searchDisplayController.searchBar setText:selectedMatch];

        return;
    }
    ...

しかし、テキストで同じことをすると-searchBarSearchButtonClicked:、検索バーに残りません。この状況でこれを達成する方法についてのアイデアはありますか?

関連して、検索バーのテキストを設定すると(ただし、UISearchDisplayController非アクティブのままにする)、searchResultsTableViewの表示がトリガーされます。ユーザーが検索バーをタップしたときにのみ表示したい。

編集:常にsearchResultsTableViewを表示せずに検索バーのテキストを設定する回避策を見つけました:

// This hacky YES NO is to keep results table view hidden (animation required) when setting search bar text
[self.searchDisplayController setActive:YES animated:YES];
[self.searchDisplayController setActive:NO animated:YES];
self.searchDisplayController.searchBar.text = @"text to show";

より良い提案はまだ歓迎されています!

4

2 に答える 2

8

実際には、searchMatches 配列で正しい要素を選択するための indexPath がないため、searchBarSearchButtonClicked メソッド内で同じコードを使用することはできません。

ユーザーが検索ボタンをクリックし、searchController インターフェースを非表示にしたい場合は、検索内にどのテキストを入れるかを決める必要があります (たとえば、リストで最も一致する結果を選択するなど)。

この例では、ユーザーが検索ボタンをクリックしたときに、検索用語が表示されたまま変更されないようにしています。

-(void) searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    NSString *str = searchBar.text;
    [self.searchController setActive:NO animated:YES];
    self.searchController.searchBar.text = str;
}

これが役に立てば幸いです、ヴィンセント

于 2011-01-21T06:46:47.917 に答える
4

検索バーの文字列を手動でリセットすると、UISearchDisplayDelegate メソッドの一部が再びトリガーされます。この場合、これはおそらく望まないことです。

vdaubry の回答を少し変更すると、次のようになります。

-(void) searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    NSString *str = searchBar.text;
    [self.searchController setActive:NO animated:YES];
    self.searchController.delegate = nil;
    self.searchController.searchBar.text = str;
    self.searchController.delegate = self //or put your delegate here if it's not self!
}
于 2013-10-28T23:05:18.380 に答える