UISearchController 在关闭时清除 UISearchBar 文本
Posted
技术标签:
【中文标题】UISearchController 在关闭时清除 UISearchBar 文本【英文标题】:UISearchController clears UISearchBar text when dismissed 【发布时间】:2016-12-31 01:49:13 【问题描述】:在UITableViewController
的自定义子类的viewDidLoad
中,我将navigationItem.titleView
设置为UISearchController
的searchBar
,我用nil
为searchResultsController
初始化了它。
当我点击搜索栏,输入文本,然后点击变暗的底层内容时,UISearchController
会被停用(如预期的那样)并且我输入的搜索文本会被清除(意外)。
当我明确(以编程方式)将搜索控制器设置为非活动时,搜索文本也被清除(也是意外)。为了解决这个问题,我之前存储了搜索文本,并在关闭搜索控制器后将其设置回来。虽然 hacky,但它确实有效。
let searchText = searchBar.text // #hack
searchController.isActive = false
searchBar.text = searchText // #hack
当搜索控制器被自动关闭时,我尝试了使用UISearchControllerDelegate
方法的类似方法,即将搜索文本存储在willDismissSearchController(_:)
中并将其设置回didDismissSearchController(_:)
。但是,这个解决方案仍然显示搜索文本被清除,然后恢复到以前的状态。
当搜索控制器自动关闭时,如何无缝保持搜索栏文本不变?
【问题讨论】:
uisearchbar 委托。 搜索栏的代理如何阻止搜索控制器清除其文本? uisearchbar 委托方法我有演示但现在我不在电脑附近 也许您应该创建一个自定义搜索控制器并向其添加自定义搜索栏属性。然后为搜索控制器和搜索栏声明自定义委托。 子类UISearchBar
?
【参考方案1】:
对于显式(以编程方式)关闭搜索控制器,UISearchController
是一个视图控制器,因此您可以直接调用 dismiss(animated:completion:)
而不是设置 isActive = false
并重置搜索文本:
searchController.dismiss(animated: true)
搜索栏文本在关闭后仍会保留在搜索栏中。
【讨论】:
【参考方案2】:在searchBarTextDidEndEditing(_:)
中,将searchBar.text
设置回原来的状态。
见:UISearchBar : How to prevent Cancel Button from clearing text?
【讨论】:
【参考方案3】:我通过将Apple's sample projects 之一与我自己的比较解决了这个问题。事实证明,您希望在单独的表视图控制器中显示结果,而不是在未过滤的数据中显示结果。在初始化你的 UISearchController 之前,设置一个单独的 TableViewController,当你初始化你的 UISearchController 时,将单独的表视图控制器作为searchResultsController:
参数发送。
searchController = UISearchController(searchResultsController:
self.searchResultsController)
然后在updateSearchResults(for:)
方法中我在过滤结果后调用了self.searchResultsController.tableView.reloadData()
。
这个单独的视图控制器将使搜索控制器按照您期望的方式运行。我知道这不是一个简单的解决方案。为了以一种让人感觉它们与未过滤数据显示在同一个表格视图中的方式显示搜索结果的兴趣,我不确定 Apple 为什么要这样设计它,但它就是这样设计的。
【讨论】:
以上是关于UISearchController 在关闭时清除 UISearchBar 文本的主要内容,如果未能解决你的问题,请参考以下文章
按下取消按钮时如何防止 UISearchController 关闭?
在 tvos 中更改焦点时如何关闭 UISearchController 中的键盘?
带有大标题的 UISearchController,UI 在关闭时行为不端
UISearchController 结果 TableViewController 在 UISearchBar 为空时不清除结果