【问题标题】:Keeping UINavigationController's navigationBar hidden after UISearchDisplayController selection在 UISearchDisplayController 选择后保持 UINavigationController 的导航栏隐藏
【发布时间】:2011-01-21 09:00:43
【问题描述】:

我有一个UISearchDisplayController 设置,其中UITableViewController 嵌套在UINavigationController 中。当进行选择时,触发UITableView's 987654325 didSelectRowAtIndexPath didSelectRowAtIndexPathformet,这将新视图推送给父导航控制器。这个新视图应该在入口处隐藏导航栏。

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

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

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

有谁知道导航栏的取消隐藏发生在哪里,和/或我可以通过什么方式覆盖此行为?

【问题讨论】:

  • 对不起,我还没有标记正确的答案;我最终确实找到了一个可行的 hack,它可能与下面的一个相同,但我已经继续前进并且有一段时间没有看过那个项目了。当我有机会时,我会检查我使用的方法并更新这个问题。
  • 你最终使用了哪个 hack?

标签: iphone iphone-sdk-3.0 uisearchdisplaycontroller


【解决方案1】:

这可能不是最优雅的解决方案,但我相信它完全符合您的要求。我遇到了类似的问题,我的解决方案是有一个隐藏导航栏的方法,延迟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] 但这根本不起作用,所以坚持我上面的内容。

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

【讨论】:

  • 该死的,这让我花了一个小时的大部分时间。谢谢!澄清一下,你需要把它放在被推送到导航堆栈的视图控制器中。
【解决方案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];
    }
}

请注意,我们在调用超级 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,但它确实起到了作用,我看不出有更好的方法。

【讨论】:

    【解决方案3】:

    遇到了同样的问题,设法通过这个丑陋的 hack 让它顺利运行:

    - (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];
    }
    

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:
        - (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];
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-04
          • 2011-02-18
          • 1970-01-01
          • 1970-01-01
          • 2013-05-25
          • 2014-10-26
          • 1970-01-01
          • 2014-09-02
          相关资源
          最近更新 更多