UISearchBar:如何防止取消按钮清除文本



我的应用程序中有一个带有UISearchBar的屏幕。当用户进入屏幕时,搜索栏中可能已经有文本了如果用户点击字段,然后点击取消,则不应清除搜索栏的内容

这是可以实现的吗?我试图实现searchBarCancelButtonClicked,但我对text属性的修改被忽略了,文本字段仍然被清除。

我遇到了同样的问题,并通过手动跟踪是否按下取消按钮的状态来解决它。如果是,则在searchBar结束编辑时重置文本,因为在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
}
}

这方面的更新,从iOS 15开始,iOS 15中的更改似乎改变了searchBarCancelButtonClickedsearchBarTextDidEndEditing委托方法的调用顺序。

在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中中断了,经过快速调查,我可以看到searchBarTextDidEndEditing委托方法总是在searchBarCancelButtonClicked方法之前调用。目前尚不清楚这是苹果公司有意做出的改变,还是确实存在漏洞。

除此之外,我找到了一个简单的解决方法来解决最初的问题,并发现从异步调度块设置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顽固默认行为的任何其他变通方法一样,现在或以后都会带来未知副作用的固有风险

最新更新