6

我的应用程序使用UISearchDisplayController. 当用户输入搜索词时,我希望它在搜索栏中保持可见。如果用户选择匹配的结果之一,则此方法有效,但如果用户单击“搜索”按钮则无效。

这有效:

- (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

实际上,您不能在 searchBarSearchButtonClicked 方法中使用相同的代码,因为您没有 indexPath 来选择 searchMatches 数组中的正确元素。

如果用户单击搜索按钮并且您想隐藏 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 回答