当UISearchController处于活动状态时,iOS 9 searchBar从表头视图中消失

结构:

View1(点击一个button) – >现在模态(MyModalView:UITableViewController)

MyModalViewembedded了UISearchController。 UISearchController的searchBar放置在MyModalView.tableView.tableHeaderView中。

从iOS 8.0开始,它一直在正常工作。 但是,在iOS 9上,当UISearchController处于活动状态时,searchBar会消失。 请看下面的这些照片

模态观点: 模态视图

UISearchController在iOS 8上处于活动状态: iOS 8中的搜索栏

UISearchController在iOS 9上处于活动状态: iOS 9中的搜索栏

非常标准的代码:

override func viewDidLoad() { super.viewDidLoad() // Dynamically create a search controller using anonymous function self.resultSearchController = ({ let controller = UISearchController(searchResultsController: nil) controller.searchResultsUpdater = self controller.dimsBackgroundDuringPresentation = false controller.searchBar.sizeToFit() controller.searchBar.delegate = self self.tableView.tableHeaderView = controller.searchBar return controller })() // Auto sizing row & cell height self.tableView.estimatedRowHeight = 130 self.tableView.rowHeight = UITableViewAutomaticDimension self.definesPresentationContext = true // No footer for better presentation self.tableView.tableFooterView = UIView.init(frame: CGRectZero) } 

这个问题也发生在iOS 9.1 beta …

任何想法/指针将深受赞赏

干杯。

我不确定究竟是什么问题,但我通过以下方法“修复”:

 self.searchController.hidesNavigationBarDuringPresentation = NO; self.definesPresentationContext = NO; 

我的猜测是,当UISearchController试图呈现为导航栏时,它正在做一些有趣的事情。 所以,这是一个黑客,但至less不会阻止用户。 search栏不会做很酷的animation,并遮住导航栏。

看起来我们大家都有同样的问题,但他们以不同的方式解决。 然而,没有build议的答案为我工作:(尽pipe如此,谢谢大家的时间。

我有一个解决scheme,解决了我的问题。 它使用界面生成器将“我的(MyModalView:UITableViewController)”的“不透明条”下的“延伸边”设置为“真”。

综上所述:

MyModalView:UITableViewController,在使用Interface Builder的Storyboard中有

延伸边缘: – 在顶部酒吧勾选 – 在底部酒吧勾选 – 在不透明酒吧勾选

截图

我发现这是故事板中的模拟指标(顶部栏),导致了这个问题。 在我的情况下,以下线路工作,但我仍然不知道为什么。

 - (void)willPresentSearchController:(UISearchController *)searchController { // do something before the search controller is presented self.navigationController.navigationBar.translucent = YES; } -(void)willDismissSearchController:(UISearchController *)searchController { self.navigationController.navigationBar.translucent = NO; } 

我不得不

 self.aNavigationController?.extendedLayoutIncludesOpaqueBars = true 

我在这里发现了一个类似的问题,但在我的情况下,它不是在viewDidLoad方法。 我必须尝试不同的意见,直到它的工作。 现在我可以同时拥有自定义的导航栏颜色和search栏,

谢谢@wiles段和@Techprimate

在我的情况下,我通过设置:

 self.definesPresentationContext = NO; 

并在UISearchControllerDelegate中实现以下2个方法

 - (void)willPresentSearchController:(UISearchController *)searchController { // do something before the search controller is presented self.navigationController.navigationBar.translucent = YES; } -(void)willDismissSearchController:(UISearchController *)searchController { self.navigationController.navigationBar.translucent = NO; } 

我通过删除在我的情况下固定它

definesPresentationContext = true

我还没有testing,如果有任何消除这个缺点!

我在这个应用程序的地方没有导航栏。 没有其他SOpost帮助了我,所以我已经解决了这个问题:

 - (void)layoutSubviews { [[[self searchController] searchBar] sizeToFit]; } 

设置导航条永久在故事板半透明解决了我的问题。

有用

 override func viewDidLoad() { super.viewDidLoad() self.extendedLayoutIncludesOpaqueBars = !self.navigationController!.navigationBar.translucent } 

我有同样的问题,当我在Xcode上debuggingUI时,我发现UISearchBar视图被移动到另一个视图,宽度为零。

我通过将UISearchController definesPresentationContext属性设置为false来修复它,并将其设置为包含UITableViewController

我只添加了一行到你的viewDidLoad()

 override func viewDidLoad() { super.viewDidLoad() // Dynamically create a search controller using anonymous function self.resultSearchController = ({ let controller = UISearchController(searchResultsController: nil) controller.searchResultsUpdater = self controller.dimsBackgroundDuringPresentation = false controller.definesPresentationContext = false // Disable the presentation controller controller.searchBar.sizeToFit() controller.searchBar.delegate = self self.tableView.tableHeaderView = controller.searchBar return controller })() // Auto sizing row & cell height self.tableView.estimatedRowHeight = 130 self.tableView.rowHeight = UITableViewAutomaticDimension self.definesPresentationContext = true // This one remains the same // No footer for better presentation self.tableView.tableFooterView = UIView.init(frame: CGRectZero) } 

如果你想隐藏你的导航栏,并显示search控制器全屏,在导航栏上设置以下内容,search栏不会消散:

 navigationController?.navigationBar.translucent = true