我有一个UISearchDisplayController
设置UITableViewController
嵌套在UINavigationController
内。在选择单元格时,会触发UITableView's
didSelectRowAtIndexPath
方法,将新视图推送到父导航控制器。此新视图应在导入栏中隐藏导航栏。
[[self navigationController] setNavigationBarHidden:YES animated:NO];
我在didSelectRowAtIndexPath
方法中使用此行来隐藏导航栏。如果选择的行不使用搜索控制器,但在选择搜索结果时被覆盖,则此方法可以正常工作。似乎UISearchDisplayController
在选择行之后的某个时候取消了导航栏的权利。
如果我将setNavigationBarHidden
调用移动到目标视图的viewWillAppear
方法,则结果类似。我可以通过将隐藏调用放在viewDidAppear
中来使其工作,但这会使非常尴尬的过渡效果感到跳跃和不合适。我想在新视图滑到屏幕之前使navigationBar已经隐藏。
有没有人知道导航栏的取消隐藏在哪里,和/或我可以覆盖此行为的任何方式?
答案 0 :(得分:6)
这可能不是最优雅的解决方案,但我相信它完全符合您的要求。我遇到了类似的问题,我的解决方案是使用隐藏导航栏的方法,该方法在延迟0秒后调用,如下所示。
调用的方法是:
-(void) hideNavBar {
if (self.navigationController.navigationBar.hidden == NO)
{
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
}
然后在viewDidLoad方法中,我有以下内容:
[self performSelector:@selector(hideNavBar) withObject:nil afterDelay:0.0];
这可以在一瞬间移除导航栏。如果您想要动画,可以修改延迟时间,或者在延迟后删除它。我试过[self hideNavBar],但这根本不起作用,所以坚持上面的内容。
希望这会有所帮助,如果有人有更优雅的解决方案,我很感兴趣!
答案 1 :(得分:2)
好的,这让我误会了几个小时,但我终于开始工作了!问题似乎是UISearchDisplayController跟踪它是否隐藏了导航栏,如果有,则在视图被解除后恢复它。这就是为什么上面的许多答案都会看到当按下新视图时,条形动画的尾端会隐藏自己。但是,通过欺骗搜索显示控制器,我们可以更改此行为。
第一个:子类UISearchDisplayController
关于如何防止导航控制器隐藏的答案,找到了here,我修改了代码,以隐藏导航栏:
- (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];
}
}
注意我们在调用super 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];
}
}
虽然这听起来像是一个巨大的黑客,它可以解决这个问题,但我认为没有更好的办法。
答案 2 :(得分:1)
陷入同样的问题,设法让这个丑陋的黑客顺利运作:
- (void) viewWillDisappear: (BOOL) animated
{
if (searchController_.active)
{
self.navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
self.navigationController.navigationBar.tintColor = nil;
}
[super viewWillDisappear: animated];
}
- (void) viewWillAppear: (BOOL) animated
{
if (searchController_.active)
{
self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
}
[super viewWillAppear: animated];
}
答案 3 :(得分:0)
我遇到了同样的问题:我的视图默认隐藏了导航栏,这是保持隐藏的方式:
-(void) viewWillLayoutSubviews{
if (self.navigationController.navigationBar.hidden == NO)
{
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
}
这样,即使使用了搜索栏,导航栏也不会出现。
答案 4 :(得分:-1)
- (void) viewWillDisappear: (BOOL) animated
{
// self.searchOn property tell if full screen search is enabled
//if (self.searchOn)
//{
[self.navigationController setNavigationBarHidden:NO animated:NO];
//}
[super viewWillDisappear: animated];
}
- (void) viewWillAppear: (BOOL) animated
{
//if (self.searchOn)
//{
[self.navigationController setNavigationBarHidden:YES animated:YES];
//}
[super viewWillAppear: animated];
}