UISearchDisplayController隐藏导航栏

时间:2013-08-30 17:35:36

标签: ios uinavigationbar 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

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

4 个答案:

答案 0 :(得分: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)。这不是一个非常平稳的过渡,但它有效:) ....

注意: - 请勿在{{1​​}}或viewDidLoad函数中使用上述代码,因为它可能会提供不良动画。

答案 1 :(得分:6)

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

它不会隐藏导航栏。

答案 2 :(得分:3)

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

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

答案 3 :(得分:0)

我的修复程序有效

  override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        DispatchQueue.main.async {
            self.navigationController?.setNavigationBarHidden(true, animated: false)
        }
}