在viewDidLoad
的自定义子类的UITableViewController
中,我已将navigationItem.titleView
设置为searchBar
的{{1}},我使用{UISearchController
进行了初始化1}} nil
。
当我点击搜索栏,输入文字,然后点击灰暗的基础内容,然后searchResultsController
被取消激活(按预期),我输入的搜索文本被清除(意外)。
当我明确地(以编程方式)将搜索控制器设置为非活动状态时,也会清除(也是意外)搜索文本。为了解决这个问题,我先将搜索文本存储起来,然后在解除搜索控制器后将其设置回来。虽然hacky,但它确实有效。
UISearchController
当搜索控制器被自动关闭时,我尝试使用let searchText = searchBar.text // #hack
searchController.isActive = false
searchBar.text = searchText // #hack
方法尝试类似的方法,即将搜索文本存储在UISearchControllerDelegate
中并将其设置回willDismissSearchController(_:)
。但是,这个解决方案仍然显示搜索文本被清除,然后恢复到以前的状态。
当搜索控制器自动关闭时,如何无缝地保持搜索栏文本?
答案 0 :(得分:2)
在searchBarTextDidEndEditing(_:)
中,将searchBar.text
设置回原来的状态。
请参阅:UISearchBar : How to prevent Cancel Button from clearing text?
答案 1 :(得分:0)
对于(编程)明确地关闭搜索控制器,UISearchController
是视图控制器,因此您可以在其上调用dismiss(animated:completion:)
而不是设置isActive = false
并重置搜索文本:
searchController.dismiss(animated: true)
关闭后,搜索栏文本仍将保留在搜索栏中。
答案 2 :(得分:0)
我通过将Apple's sample projects中的一个与我自己的比较来解决了这个问题。事实证明,您想要在单独的表视图控制器中显示结果,而不是在未过滤的数据中显示结果。在初始化UISearchController之前,请设置单独的TableViewController,并在初始化UISearchController时,将单独的表视图控制器作为searchResultsController:
参数发送。
searchController = UISearchController(searchResultsController:
self.searchResultsController)
然后在过滤结果后用updateSearchResults(for:)
方法调用self.searchResultsController.tableView.reloadData()
。
这个独立的视图控制器将使搜索控制器以您期望的方式运行。我知道这不是一个简单的解决方案。为了以某种方式显示搜索结果以使其看起来像是与未过滤的数据在同一表格视图中显示一样,我不确定Apple为什么以此方式设计它,但事实就是这样。