好的,这困扰了我几个小时,但我终于让它工作了!问题似乎是 UISearchDisplayController 跟踪它是否隐藏了导航栏,如果有,它会在视图被关闭后恢复它。这就是为什么在上面的许多答案中,当新视图被推送时,您会看到条形动画的尾部隐藏自身。然而,通过欺骗搜索显示控制器,我们可以改变这种行为。
第一:子类化 UISearchDisplayController
遵循关于如何防止导航控制器隐藏的答案,在此处找到,我更改了代码,以保持导航栏隐藏:
- (void)setActive:(BOOL)visible animated:(BOOL)animated
{
if(self.active == visible)
return;
[self.searchContentsController.navigationController setNavigationBarHidden:YES animated:YES];
[super setActive:visible animated:animated];
if (visible)
[self.searchBar becomeFirstResponder];
else{
[self.searchBar resignFirstResponder];
[self.searchContentsController.navigationController setNavigationBarHidden:NO animated:YES];
}
}
请注意,我们在调用超级 setActive 函数之前隐藏了导航栏。这似乎阻止了超类试图隐藏导航栏,从而阻止试图在项目选择中恢复它。现在,当控制器激活时,该栏将像往常一样隐藏。另请注意,当 searchBar 退出第一响应者时,我们会恢复导航栏。如果我们取消控制器,这将恢复条形图。
二:退出时隐藏导航栏
如果我们在视图中隐藏导航栏会消失,它会被隐藏:
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[self.navigationController setNavigationBarHidden:YES animated:animated];
}
第三:返回时隐藏导航栏
现在唯一的问题是,如果我们从过滤后的 tableview 中选择一行,当我们返回时,导航栏将是可见的。要解决这个问题,我们需要检查将出现:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if(self.isFiltered){
[self.navigationController setNavigationBarHidden:YES animated:NO];
}
}
虽然这感觉像是一个巨大的 hack,但它确实起到了作用,我看不出有更好的方法来做到这一点。