【问题标题】:UISearchDisplayController hiding navigation barUISearchDisplayController 隐藏导航栏
【发布时间】:2013-08-30 17:35:36
【问题描述】:

我看到了一个奇怪的情况。我在导航栏中放置了一个搜索栏,并将 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

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

【问题讨论】:

    标签: ios uinavigationbar uisearchdisplaycontroller


    【解决方案1】:

    好的,以防万一,如果有人遇到这种情况。我针对上述情况实施了解决方法。

    问题在于,当我从导航堆栈中弹出视图控制器 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 函数中使用上述代码,因为它可能会提供不受欢迎的动画。

    【讨论】:

      【解决方案2】:
      -(void)viewDidLayoutSubviews{
          [self.navigationController setNavigationBarHidden:NO animated:NO];
      }
      

      它不会隐藏导航栏。

      【讨论】:

        【解决方案3】:

        万一有人遇到这个问题.. 我的解决方案来了。

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

        【讨论】:

        • 谢谢!您的答案对我来说效果最好,因为我使用的是过滤搜索,而其他解决方案在我完成输入之前删除了搜索。在我完全完成后,您的删除搜索。
        【解决方案4】:

        我的修复工作正常

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

        【讨论】:

          猜你喜欢
          • 2013-12-04
          • 2011-02-18
          • 2013-05-25
          • 2014-10-26
          • 2011-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多