UISearchDisplayController无法隐藏导航栏

时间:2013-11-20 18:30:14

标签: ios uikit uisearchdisplaycontroller

我正在使用搜索栏处理视图。当搜索变为活动状态时,应将导航栏设置为动画(即,如-[navigationController setNavigationBarHidden:animated:]

我已经使用UISearchDisplayController实现了这一点,除了没有隐藏导航栏之外,它主要做正确的事情。视图层次结构堆叠如下:

UIWindow
+-> IIViewDeckController
  +->UINavigationController
    +->UITableViewController

我已经初步化了这样的事情:

- (void)viewDidLoad
{
    UISearchBar *searchBar = [[UISearchBar alloc] init];
    self.searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
    self.tableView.tableHeaderView = searchBar;
}

我也尝试使用不同的抽屉控制器来查看问题是否在IIViewDeckController中,如下所示:

UIWindow
+-> MMDrawerController
  +->UINavigationController
    +->UITableViewController

通常情况下,UISearchDisplayController应从-[UINavigationController setNavigationBarHidden:animated:]中的某处调用-[UISearchDisplayController setActive:animated:]。我甚至尝试创建一个派生自UISearchDisplayController的类并重载-[UISearchDisplayController setActive:animated:]并手动隐藏导航栏,如下所示:

- (void)setActive:(BOOL)visible animated:(BOOL)animated
{
    [self.searchContentsController.navigationController setNavigationBarHidden:visible animated:animated];
    [super setActive:visible animated:animated];
}

为了清晰起见而进行了更新:这段代码确实按预期隐藏了导航栏,但是它并没有清除搜索栏以北的视图,而是最后一个视图位于顶部状态栏(这有点有意义,因为在通过-[UISearchDisplayController setActive:animated:]进行调试时,我发现它使用一些私有API来清除刷新控制器,当它隐藏导航栏时。我想。

出于某种原因,导航栏没有隐藏,我一直在试图找出原因。

什么可能导致这种行为?

更新#2

看起来我错过了层次结构中的一个视图,它似乎是某种方式的罪魁祸首(仍然不确定以什么方式,确切地说)。这是:

UIWindow
+-> MMDrawerController
   +-> UINavigationController
      +-> UITabBarController
         +-> UITableViewController

1 个答案:

答案 0 :(得分:2)

看起来UITabBarController是问题,我应该知道,因为它甚至在这里提到(How to combine TabBarController with Navigation Controller?)并且文档中的,{{ 3}}:

  

使用标签栏控制器的应用也可以使用导航   一个或多个选项卡中的控制器。当结合这两种类型时   在同一用户界面中查看控制器,标签栏控制器   始终充当导航控制器的包装器。

答案,在我看来,需要更改视图层次结构,以便没有UITabBarController(因为使用一个会要求它成为根控制器,这会强制重新设计应用程序)。看起来最可行的替代方案是although not too prominently