16

我有一个嵌套在 a 中的UISearchDisplayController设置。选择单元格后,触发方法,将新视图推向父导航控制器。这个新视图应该在入口处隐藏导航栏。UITableViewControllerUINavigationControllerUITableView's didSelectRowAtIndexPath

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

我在方法中使用这一行didSelectRowAtIndexPath来隐藏导航栏。当不使用搜索控制器选择行时,这可以正常工作,但在选择搜索结果时会被覆盖。似乎在UISearchDisplayController选择行后的某个时间取消隐藏导航栏是正确的。

如果我将setNavigationBarHidden调用移动到目标视图的viewWillAppear方法中,结果是相似的。我可以通过将 hide 调用放入 来使其工作viewDidAppear,但这会产生非常尴尬的过渡效果,让人感觉跳跃和不合适。我想让导航栏在新视图滑到屏幕上之前已经隐藏。

有谁知道navigationBar 的隐藏发生在哪里,和/或我可以以任何方式覆盖此行为?

4

5 回答 5

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] 但这根本不起作用,所以坚持我上面的内容。

希望这会有所帮助,如果有人有更优雅的解决方案,我很感兴趣!

于 2011-06-13T22:12:43.547 回答
2

好的,这困扰了我几个小时,但我终于让它工作了!问题似乎是 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,但它确实起到了作用,我看不出有更好的方法来做到这一点。

于 2013-04-06T12:42:59.197 回答
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];
}
于 2010-10-13T16:29:05.463 回答
0

我遇到了同样的问题:我的视图默认隐藏了导航栏,这是隐藏它的方法:

-(void) viewWillLayoutSubviews{
  if (self.navigationController.navigationBar.hidden == NO)
  {
    [self.navigationController setNavigationBarHidden:YES animated:YES];
  }
}

这样,即使使用了搜索栏,导航栏也不会出现。

于 2012-05-13T14:45:03.983 回答
-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];
}
于 2013-01-09T21:16:58.353 回答