【问题标题】:UISearchBar : How to prevent Cancel Button from clearing text?UISearchBar:如何防止取消按钮清除文本?
【发布时间】:2014-03-12 20:09:49
【问题描述】:

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

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

【问题讨论】:

  • 您是否正确设置了委托?
  • 使用不带cancel按钮的UISearchBar
  • @Guilherme:是的,我看到正在打印测试日志语句。
  • @Akhilrajtr:那么用户应该如何取消他的操作(散焦搜索栏)。
  • @mavilein 尝试将自定义选择器设置为cancel 按钮。

标签: ios objective-c ios7 uisearchbar


【解决方案1】:

我遇到了同样的问题,并通过手动跟踪是否按下取消按钮的状态来解决它。如果是,请在 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
    }
}

【讨论】:

  • 我在这里有一个奇怪的行为。它几乎可以正常工作,但如果我输入一些内容,然后按搜索按钮然后取消它,searchBarTextDidEndEditing 委托方法永远不会被调用,searchBar 会被清除。
  • @palme与_的使用方法:func searchBarTextDidEndEditing(_ searchBar: UISearchBar)
  • 如所写:“searchBarTextDidEndEditing 委托方法永远不会被调用”。
【解决方案2】:

对此进行了一点更新,从 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 方法之前调用。目前尚不清楚这是 Apple 有意做出的更改,还是确实是一个错误。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    相关资源
    最近更新 更多