我正在使用搜索栏处理视图。当搜索变为活动状态时,应将导航栏设置为动画(即,如-[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
答案 0 :(得分:2)
看起来UITabBarController
是问题,我应该知道,因为它甚至在这里提到(How to combine TabBarController with Navigation Controller?)并且文档中的是,{{ 3}}:
答案,在我看来,需要更改视图层次结构,以便没有UITabBarController(因为使用一个会要求它成为根控制器,这会强制重新设计应用程序)。看起来最可行的替代方案是although not too prominently。使用标签栏控制器的应用也可以使用导航 一个或多个选项卡中的控制器。当结合这两种类型时 在同一用户界面中查看控制器,标签栏控制器 始终充当导航控制器的包装器。