如何以编程方式强制在 UISearchBar 中进行搜索?

Posted

技术标签:

【中文标题】如何以编程方式强制在 UISearchBar 中进行搜索?【英文标题】:How can I programmatically force a search in the UISearchBar? 【发布时间】:2012-09-16 14:13:39 【问题描述】:

如何强制 UISearchBar 自动开始新的搜索(例如按下搜索按钮)?有没有简单的方法来实现这一点?

【问题讨论】:

没有重复,因为我们不想显示键盘,我们希望像单击搜索按钮时那样开始搜索过程。问题是逻辑在我们无权访问的库中(没有源代码) 哦,我明白了,这是有道理的。你应该把这些信息放在问题中。 ;) 类似问题here 这是自动化测试的一部分吗?或者这是您真正希望在您的应用上出现的行为? 也有问题。 【参考方案1】:

我发现在以编程方式更改搜索字段的值之前,我需要将 UISearchViewController 设置为活动状态,以使 UISearchViewController 自动执行搜索:

// Need to set the searchDisplayController to active to 
// make the changes in search text trigger a search.
self.searchDisplayController.active = YES;
self.searchDisplayController.searchBar.text = @"New search string";

斯威夫特 4

self.searchController.isActive = true
self.searchController.searchBar.text = "New search string"

【讨论】:

这很好用,并解决了我遇到的许多其他问题,例如某些委托方法没有被触发。谢谢。 值得注意的是,顺序很重要:) 我们如何使用从故事板创建的搜索栏来做到这一点?【参考方案2】:

只需让搜索输入字段成为第一响应者:

[self.searchInputField becomeFirstResponder];

【讨论】:

感谢回复,这里的 self 是什么? 当我弄清楚我们如何访问搜索栏的文本字段时,这个 becomeFirstResponder 只显示键盘,但我们确实想自动开始搜索 哦,我通常创建自己的 searchInputField 句柄,正如@tiguero 从搜索栏中所说的那样,或者只是自己初始化它。如果您无权访问输入字段,那么它会更复杂。 我们确实找到了某种解决方法。我们只是使用库开始搜索两次,并在第一次搜索返回之前取消第一次搜索,然后我们就拥有了我们喜欢的一切。这有点糟糕,但它按预期工作-.-【参考方案3】:

你可以强制你的searchBar,

目标 C:

[self searchBar:yourSearchBarName textDidChange: yourSearchingString];

Swift 3.0:

self.searchBar(self.yourSearchBarName, textDidChange: yourSearchingString)

这将触发您的搜索栏。

【讨论】:

【参考方案4】:

在确保你想要的文本在你的搜索栏中之后,你可以调用self.searchBarSearchButtonClicked(searchBar)(在你的搜索栏中传递)假设你已经实现了这个 UISearchBarDelegate 方法searchBarSearchButtonClicked(_ searchBar: UISearchBar)

【讨论】:

对我来说,这是最好的选择,也是因为它可读性很强【参考方案5】:
let searchBar: UISearchBar = /* The Searchbar */
searchBar.delegate?.searchBar?(searchBar, textDidChange: "")
searchBar.text = ""

【讨论】:

【参考方案6】:

是的,您只需隐式调用您的UISearchbarDelegate 上的searchBarSearchButtonClicked:。查看official doc 了解有关此代表的更多信息。

【讨论】:

感谢您的回复,我们确实遇到了 searchBar 嵌入在我们无法访问的视图中的问题,因此这种方法不起作用。您还有其他提示吗? 但是在你的代码中的某个地方你应该有一个委托类来处理搜索 - 不是吗? 我们无权访问那部分代码,因为它是在我们使用的库中实现的,我们无法访问源代码。我们正在尝试找到在那里使用的委托,但到目前为止我们还没有成功。 谁来处理搜索——你还是你的图书馆? 图书馆,这就是问题所在【参考方案7】:

看起来很笨,但很有效,所以它不笨;)

NSString * forceReload = self.searchDisplayController.searchBar.text;
self.searchDisplayController.searchBar.text = forceReload;

【讨论】:

【参考方案8】:

斯威夫特 5

如果你只有一个 UISearchBar(不是 UISearchViewController):

let searchBar: UISearchBar
searchBar.text = "foo" // Reset the search text
searchBar.becomeFirstResponder() // Select the field and bring up the keyboard

【讨论】:

【参考方案9】:

这行得通 - Swift 4

   searchBar.text="Amber"
   self.searchBar(self.searchBar, textDidChange: "Amber")

【讨论】:

以上是关于如何以编程方式强制在 UISearchBar 中进行搜索?的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift - 在 UISearchBar 中以编程方式触发搜索

如何触发 UISearchBar 中的取消按钮?

iOS - 以编程方式移动 UISearchBar

以编程方式将 UISearchBar 添加到 UITableView 不起作用

以编程方式为 UITableView 和 UISearchBar 设置 NSLayoutConstraints

以编程方式将 UISearchBar 添加到普通 ViewController 中以编程方式添加的 UITableView