UISearchController在继续之后保持

我有一个UISearchController的应用程序。 用户界面的这个元素完全是这样设置的:

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) 

然后我把它添加到我的tableView的tableHeaderView

 tableView.tableHeaderView = searchController.searchBar 

一切似乎工作正常,但是当它是活跃的,我在我的tableView中select一个项目,我的应用程序继续到另一个视图控制器的search控制器坚持视图。 我不确定如何这是可能的,因为search控制器应该是另一个视图控制器中的表视图的子视图。 我怎样才能防止这种情况发生?

截图

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

 searchController.active = false 

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

 definesPresentationContext = true 

来自definePresentationContext的文档

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

讨论

当呈现视图控制器时,iOS从呈现视图控制器开始,并询问它是否想要提供呈现上下文。 如果呈现视图控制器没有提供上下文,那么iOS会询问呈现视图控制器的父视图控制器。 iOS通过视图控制器层次结构进行search,直到视图控制器提供演示上下文为止。 如果没有视图控制器提供提供上下文,则窗口的根视图控制器提供了显示上下文。

如果一个视图控制器返回true,那么它提供了一个表示上下文。 视图控制器视图覆盖的窗口部分决定了所呈现的视图控制器视图的大小。 此属性的默认值为false。

如果您pipe理自己的转换并使用popToViewController离开视图,请在searchController而不是视图上提供上下文

 searchController.definesPresentationContext = true 

或者你会得到一个错误

 popToViewController:transition: called on <UINavigationController 0x7f984204f800> while an existing transition or presentation is occurring; the navigation stack will not be updated