2013-08-30 204 views
2

我看到一个奇怪的情况。我在导航栏中放置了一个搜索栏,并将UISearchDisplayController与搜索栏关联起来。现在,当用户点击搜索栏时,搜索显示控制器倾向于隐藏导航栏(因此也隐藏搜索栏)。为了反驳说,我子类UISearchDisplayController并实施了下面的代码: -UISearchDisplayController隐藏导航栏

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

现在,这种解决原有问题。我能够搜索并导航到其他控制器。

但是,可以说我对视图控制器A进行搜索,然后单击搜索结果,然后将视图控制器B推到导航堆栈上。现在,如果我弹出视图控制器B并返回到A,则我的导航栏消失。它看起来像搜索显示控制器是活动的,所以它隐藏了导航栏。

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

那么,有没有什么办法可以让我的搜索显示控制器保持活动状态,并且当我从导航堆栈中弹出视图控制器B时,导航栏不会消失?

而且我针对iOS6的

(这是一个很长的代码,所以不知道我应该在这里张贴的内容)。

回答

11

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

问题是,当我从导航堆栈中弹出视图控制器B时,searchDisplayController在视图控制器A中仍处于活动状态。现在,searchDisplayController假定搜索栏应始终位于导航栏(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]; 
} 

上面提供了一个动画,使得当用户查看弹出控制器B,视图控制器A示出了它的搜索栏激活(如果用户以前试图在查看控制器B之前搜索任何内容)。它不是一个非常平稳的过渡,但它的工作:) :)

注意: - 请不要在viewDidLoadviewDidAppear函数使用上述代码,因为它可能会提供不需要的动画。

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

它不会隐藏导航栏。

+1

工作就像一个魅力,应该被接受的答案。 – Matt

3

如果有人遇到这个问题.. 这里是我的解决方案。

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

谢谢!您的回答对我来说效果最佳,因为我使用了过滤搜索,而其他解决方案在完成键入之前删除了搜索。完成完成后,您的所有人都将删除搜索。 –