我在我的应用中有一个带有UISearchBar
的屏幕。当用户进入该屏幕时,搜索栏中可能已经有文本。如果用户然后点击字段并点击取消,则不应清除搜索栏的内容。
这可行吗? 我尝试实现searchBarCancelButtonClicked
,但我的对文本属性的修改被忽略了,文本字段仍然被清除了。
我在我的应用中有一个带有UISearchBar
的屏幕。当用户进入该屏幕时,搜索栏中可能已经有文本。如果用户然后点击字段并点击取消,则不应清除搜索栏的内容。
这可行吗? 我尝试实现searchBarCancelButtonClicked
,但我的对文本属性的修改被忽略了,文本字段仍然被清除了。
我曾遇到同样的问题,解决方法是手动跟踪取消按钮是否被按下的状态。如果是的话,在搜索栏结束编辑时重置文本,因为在searchBarCancelButtonClicked
中修改searchBar.text
不起作用:
这是我在我的UISearchBarDelegate
类中所做的:
var searchTerms = ""
var searchWasCancelled = false
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
searchWasCancelled = false
}
func searchBarCancelButtonClicked(searchBar: UISearchBar) {
searchWasCancelled = true
}
func searchBarTextDidEndEditing(searchBar: UISearchBar) {
if searchWasCancelled {
searchBar.text = self.searchTerms
} else {
searchTerms = searchBar.text
}
}
searchBarTextDidEndEditing
委托方法就不会被调用,而searchBar
会被清除。 - palmefunc searchBarTextDidEndEditing(_ searchBar: UISearchBar)
。 - Robert Dresler关于此事,有些更新。在 iOS 15 中,似乎会改变 searchBarCancelButtonClicked
和 searchBarTextDidEndEditing
代理方法的调用顺序。
在 iOS 15 之前,以下类似于状态的解决方案对于大多数用例都是适用的:
var searchTerms = ""
var searchWasCancelled = false
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
searchWasCancelled = false
}
func searchBarCancelButtonClicked(searchBar: UISearchBar) {
searchWasCancelled = true
}
func searchBarTextDidEndEditing(searchBar: UISearchBar) {
if searchWasCancelled {
searchBar.text = self.searchTerms
} else {
searchTerms = searchBar.text
}
}
遗憾的是,在iOS 15中,这个问题出现了。经过一番快速调查,我发现在searchBarCancelButtonClicked
方法之前,searchBarTextDidEndEditing
委托方法总是被调用。目前还不清楚这是否是苹果有意更改的结果,或者确实是一个错误。
除此之外,我找到了一个简单的解决方法来回答原始问题,并发现从异步调度块设置searchBar.text
将成功修改文本。像这样:
var previousSearchTerm = ""
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
previousSearchTerm = searchBar.text ?? ""
}
func searchBarCancelButtonClicked(searchBar: UISearchBar) {
DispatchQueue.main.async {
searchBar.text = self.previousSearchTerm
}
}
现在这个方法适用于iOS 15及之前的版本,在我的特定使用情况下是有效的。然而,根据你想要实现的目标,这可能不足以保证向后兼容性。值得注意的是,像任何其他修改UIKit顽固默认行为的解决方法一样,这种方法存在未知副作用的风险,无论是现在还是将来。
UISearchBar
。 - Akhilrajtr