UISearchController在segue后仍然存在

30

我有一个带有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中选择一个项目时,我的应用程序会过渡到另一个视图控制器,并且搜索控制器仍然存在于视图中。我不确定这是如何可能的,因为搜索控制器应该是另一个视图控制器中tableView的子视图。我该如何防止这种情况发生?

screenshot


prepareForSegue 中只是将其设置为 'nil' 是否太过于 hacky 了? - Tim Quinn
最好的部分是,当我在prepareForSegue中调用tableView.tableHeaderView = nil时,它根本没有任何影响。或者你是指将整个searchController设置为nil?如果是这种情况,我不确定处理所有这些的最佳方法是什么。 - Kilian
1
尝试在prepareForSegue中将searchController.active设置为false - Praveen Gowda I V
看起来可以了,谢谢!能否把它写成答案呢? :) - Kilian
@KilianKoeltzsch 完成 - Praveen Gowda I V
2个回答

60

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

searchController.active = false

或者,您可以在viewDidLoad()中添加以下行以获得默认行为

definesPresentationContext = true

根据definesPresentationContext文档,此布尔值指示当视图控制器或其后代呈现视图控制器时是否覆盖了该视图控制器的视图。

当一个视图控制器被呈现时,iOS从呈现视图控制器开始询问它是否想提供呈现上下文。如果呈现视图控制器没有提供上下文,则iOS会询问呈现视图控制器的父视图控制器。iOS沿着视图控制器层次结构向上搜索,直到一个视图控制器提供了呈现上下文。如果没有视图控制器提供上下文,则窗口的根视图控制器提供呈现上下文。

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

重要提示(来自@ paulvs在评论中):将definesPresentationContext设置在视图控制器上,而不是搜索控制器上,我认为这很值得强调。


谢谢!特别是关于演示文稿上下文的那一部分! - Kilian
2
搜索和尝试了四个小时的不同选项,但是找不到可行的解决方案!尝试了 searchBar.hidden = true 但它在各个地方都造成了很大的破坏。再次感谢! - Slav
3
definesPresentationContext是完全正确的答案。如果你使用其他选项,比如将dismiss或active设置为false,它会取消你最初的搜索结果,而definesPresentationContext则可以让你回到最初期望的情况下。非常感谢。 - Darren
7
小提示:在视图控制器上设置definesPresentationContext,而不是搜索控制器,我认为这值得强调。 - paulvs
如果你发现键盘停留的时间有点长,你可以在prepareForSegue的顶部添加searchController.searchBar.resignFirstResponder()。 - Jonathan Berger
显示剩余2条评论

4

如果您管理自己的转换并使用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

1
这是真的,self.definesPresentationContext = true 不起作用。 - fujianjin6471

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