问题描述
我看到了一个奇怪的情况.我在导航栏中放置了一个搜索栏,并将 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 函数中使用上述代码,因为它可能会提供不受欢迎的动画.