我看到一种奇怪的情况。我在导航栏中放了一个搜索栏,并将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
(这是一个很长的代码,所以不知道我应该在这里发布什么)。
答案 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)
}
}