我有一个带有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)
然后我将它添加到我的tableView的tableHeaderView
tableView.tableHeaderView = searchController.searchBar
一切似乎都运行良好,但是当它处于活动状态并且我在tableView中选择了一个项目时,我的应用程序会切换到另一个视图控制器,搜索控制器会持久保存在视图中。我不确定这是如何可能的,因为搜索控制器应该是另一个视图控制器中表视图的子视图。我怎样才能防止这种情况发生?
答案 0 :(得分:53)
您可以通过在prepareForSegue
中将active属性设置为false来手动隐藏searchController。在prepareForSegue()
searchController.active = false
或者,您应在viewDidLoad()
中添加以下行以获取默认行为
definesPresentationContext = true
的文档
一个布尔值,指示当视图控制器或其后代之一呈现视图控制器时是否覆盖此视图控制器的视图。
讨论
当呈现视图控制器时,iOS将从呈现视图控制器开始,并询问它是否要提供演示文稿 上下文。如果呈现视图控制器未提供上下文, 然后iOS询问呈现视图控制器的父视图 控制器。 iOS通过视图控制器层次结构向上搜索 直到视图控制器提供演示文稿上下文。如果没有观点 controller提供了一个上下文,窗口的根视图 controller提供演示文稿上下文。
如果视图控制器返回true,则它提供演示文稿 上下文。窗口的一部分由视图控制器覆盖 view确定显示的视图控制器视图的大小。 此属性的默认值为false。
答案 1 :(得分:3)
如果您管理自己的过渡并使用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