UISearchController在被取消时清除UISearchBar中的文本

8
在我的自定义UITableViewController子类的viewDidLoad中,我已经将navigationItem.titleView设置为一个UISearchControllersearchBar,其中searchResultsController被初始化为nil
当我点击搜索栏、输入文字并点击暗淡的底层内容时,UISearchController会被停用(正如预期),而我输入的搜索文本也会被清除(出乎意料)。
当我明确(通过程序)将搜索控制器设置为不活动状态时,搜索文本也会被清除(同样出乎意料)。为了解决这个问题,我会在关闭搜索控制器之前存储搜索文本,然后重新设置文本。虽然有些繁琐,但它起作用。
let searchText = searchBar.text // #hack
searchController.isActive = false
searchBar.text = searchText     // #hack

当搜索控制器自动关闭时,我尝试使用UISearchControllerDelegate方法来实现类似的功能,即在willDismissSearchController(_:)中存储搜索文本,并在didDismissSearchController(_:)中将其设置回去。但是,这种解决方案仍然显示搜索文本被清除,然后重新设置为之前的内容。

当搜索控制器自动关闭时,如何无缝地保留搜索栏中的文本?


UISearchBar代理。 - aircraft
搜索栏的代理如何防止搜索控制器清除其文本? - ma11hew28
UISearchBar代理方法,我有演示但现在离电脑不近。 - aircraft
也许你应该创建一个自定义搜索控制器并添加一个自定义搜索栏属性。然后声明搜索控制器和搜索栏的自定义代理。 - LinShiwei
子类化UISearchBar - SwiftArchitect
显示剩余2条评论
3个回答

6

如果需要通过编程的方式明确地关闭搜索控制器,可以直接调用UISearchController视图控制器的dismiss(animated:completion:)方法,而不是设置isActive = false并重置搜索文本:

searchController.dismiss(animated: true)

在关闭搜索栏后,搜索栏文本仍会保留在搜索栏中。

这真是一颗宝石,我一直在苦苦挣扎解决这个问题,使用 didDismissSearchController 函数进行Hack,但是受到了延迟的困扰,这个方法解决了一切,并且还避免了大量的当前状态存储/控制! - Levan Apakidze

1

0
我通过比较苹果的示例项目之一和我的项目来解决这个问题。事实证明,您希望在单独的表视图控制器中显示结果,而不是在未过滤的数据中显示。在初始化UISearchController之前,设置一个单独的TableViewController,并在初始化UISearchController时将单独的表视图控制器作为searchResultsController:参数发送。
searchController = UISearchController(searchResultsController: 
                       self.searchResultsController)

然后在updateSearchResults(for:)方法中,我在过滤结果后调用了self.searchResultsController.tableView.reloadData()

这个单独的视图控制器将使搜索控制器表现出您所期望的方式。我知道这绝不是一个简单的解决方案。为了以一种让人感觉搜索结果被呈现在与未过滤数据相同的表格视图中的方式来显示搜索结果,我不确定为什么苹果设计成这样,但事实就是如此。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接