UISearchDisplayController隐藏导航栏

我看到一个奇怪的情况。 我已经在导航栏中放置了一个search栏,并将UISearchDisplayController与search栏相链接。 现在,当用户点击search栏时,search显示控制器倾向于隐藏导航栏(因此隐藏search栏)。 为了反击,我分类了UISearchDisplayController并实现了以下代码:

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

现在,这固定了原来的问题。 我能够search并导航到其他控制器。

但是,可以说我在视图控制器A上search,然后单击一个search结果,然后将视图控制器B推到导航堆栈上。 现在,如果我popup视图控制器B并返回到A,那么我的导航栏消失。 它看起来像search显示控制器是活动的,所以它隐藏了导航栏。

如果我使search显示控制器处于非活动状态,然后按下视图控制器B然后popup,则会出现导航栏。

那么,有什么办法,我的search显示控制器可以保持活动,导航栏不会消失,当我从导航堆栈popup视图控制器B?

而我的目标是iOS6

(这是一个很长的代码,所以不知道我应该在这里发布)。

好吧,以防万一,如果有人面临这种​​情况。 我为上述情况实施了一项工作。

问题是,当我从导航堆栈中popup视图控制器B时,searchDisplayController在视图控制器A中仍处于活动状态。现在,searchDisplayController假定search栏应始终位于导航栏(AFAIK)的下方。 因此,当再次显示视图控制器A时,它没有显示导航栏。 为了解决这个问题,我在视图控制器A的viewWillLayoutSubviews函数中编写了下面的代码。

 -(void)viewWillLayoutSubviews { if(self.searchDisplayController.isActive) { [UIView animateWithDuration:0.001 delay:0.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ [self.navigationController setNavigationBarHidden:NO animated:NO]; }completion:nil]; } [super viewWillLayoutSubviews]; } 

以上提供了animation,以便当用户popup视图控制器B时,视图控制器A显示其search栏被激活(如果用户在去查看控制器B之前已经尝试search任何东西)。 这是不是一个非常平稳的过渡,但它的作品:) ….

注意: – 不要在viewDidLoadviewDidAppear函数中使用上面的代码,因为它可能会提供不需要的animation。

 -(void)viewDidLayoutSubviews{ [self.navigationController setNavigationBarHidden:NO animated:NO]; } 

它不会隐藏导航栏。

如果有人遭受这个问题..这里是我的解决scheme。

 -(void) viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; // check if searchDisplayController still active.. if ([searchDisplayController isActive]) { [searchDisplayController setActive:NO]; } }