我看到一个奇怪的情况。我在导航栏中放了一个搜索栏,并将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
(这是一个很长的代码,所以不知道我应该在这里发布什么)。
好吧,以防万一,如果有人面临这种情况。我针对上述情况实施了一项工作。
问题是当我从导航堆栈中弹出视图控制器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之前搜索任何内容)。这不是一个非常平稳的过渡,但它的工作:) ....
注意: - 请勿在viewDidLoad
或viewDidAppear
函数中使用上述代码,因为它可能会提供不需要的动画。
-(void)viewDidLayoutSubviews{
[self.navigationController setNavigationBarHidden:NO animated:NO];
}
它不会隐藏导航栏。
如果有人遇到这个问题..这是我的解决方案。
-(void) viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
// check if searchDisplayController still active..
if ([searchDisplayController isActive]) {
[searchDisplayController setActive:NO];
}
}
我的修复工作正常
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
DispatchQueue.main.async {
self.navigationController?.setNavigationBarHidden(true, animated: false)
}
}