在UISearchDisplayController选择之后保持UINavigationController的navigationBar隐藏

时间:2010-02-26 08:47:26

标签: iphone iphone-sdk-3.0 uisearchdisplaycontroller

我有一个UISearchDisplayController设置UITableViewController嵌套在UINavigationController内。在选择单元格时,会触发UITableView's didSelectRowAtIndexPath方法,将新视图推送到父导航控制器。此新视图应在导入栏中隐藏导航栏。

[[self navigationController] setNavigationBarHidden:YES animated:NO];

我在didSelectRowAtIndexPath方法中使用此行来隐藏导航栏。如果选择的行不使用搜索控制器,但在选择搜索结果时被覆盖,则此方法可以正常工作。似乎UISearchDisplayController在选择行之后的某个时候取消了导航栏的权利。

如果我将setNavigationBarHidden调用移动到目标视图的viewWillAppear方法,则结果类似。我可以通过将隐藏调用放在viewDidAppear中来使其工作,但这会使非常尴尬的过渡效果感到跳跃和不合适。我想在新视图滑到屏幕之前使navigationBar已经隐藏。

有没有人知道导航栏的取消隐藏在哪里,和/或我可以覆盖此行为的任何方式?

5 个答案:

答案 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];
}