在segue之后持久化的UISearchController

Kil*_*ian 27 cocoa-touch uitableview ios segue uisearchcontroller

我有一个带有UISearchController的应用程序.UI的这个元素完全在代码中设置如下:

searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.searchBar.delegate = self
searchController.dimsBackgroundDuringPresentation = false
searchController.hidesNavigationBarDuringPresentation = false
searchController.searchBar.searchBarStyle = UISearchBarStyle.Minimal

searchController.searchBar.frame = CGRectMake(searchController.searchBar.frame.origin.x, searchController.searchBar.frame.origin.y, searchController.searchBar.frame.size.width, 44.0)
Run Code Online (Sandbox Code Playgroud)

然后我将它添加到我的tableView的tableHeaderView中

tableView.tableHeaderView = searchController.searchBar
Run Code Online (Sandbox Code Playgroud)

一切似乎都运行良好,但是当它处于活动状态并且我在tableView中选择一个项目时,我的应用程序会切换到另一个视图控制器,并且搜索控制器会持久保存在视图中.我不确定这是如何可能的,因为搜索控制器应该是另一个视图控制器中表视图的子视图.我怎样才能防止这种情况发生?

截图

Pra*_*I V 57

您可以通过将active属性设置为false来手动隐藏searchController prepareForSegue.添加以下代码prepareForSegue()

searchController.active = false
Run Code Online (Sandbox Code Playgroud)

或者,您应该添加以下行viewDidLoad()以获取默认行为

definesPresentationContext = true
Run Code Online (Sandbox Code Playgroud)

来自definitionsPresentationContext的文档

一个布尔值,指示当视图控制器或其后代之一呈现视图控制器时是否覆盖此视图控制器的视图.

讨论

当呈现视图控制器时,iOS将从呈现视图控制器开始,并询问它是否要提供演示文稿上下文.如果呈现视图控制器未提供上下文,则iOS会询问呈现视图控制器的父视图控制器.iOS通过视图控制器层次结构向上搜索,直到视图控制器提供演示文稿上下文.如果没有视图控制器提供上下文,则窗口的根视图控制器提供表示上下文.

如果视图控制器返回true,则它提供演示文稿上下文.视图控制器视图覆盖的窗口部分确定了呈现的视图控制器视图的大小.此属性的默认值为false.

  • 小小的问题.在视图控制器上设置definePresentationContext,而不是搜索控制器,我认为值得强调. (7认同)
  • definitionsPresentationContext完全是正确的答案.如果您使用任何其他选项(如dismiss或active to false),它将取消原始搜索,而definesPresentationContext会将您带回到您期望的内容.非常感谢. (3认同)
  • 4个小时的搜索和尝试不同的选项,并没有找到工作的解决方案!试图**searchBar.hidden = true**但它到处都造成了很大的伤害.再次感谢 ! (2认同)