2014-12-29 146 views
4

我正在尝试获取搜索栏,它的范围在导航栏中,就像视图第一次出现的方式一样。如果只需将UISearchBar拖放到界面构建器中的表视图控制器上,它将像表头一样放置在表格中。然后,当你点击它时,它会动画进入我之后的编队。问题是我希望它无需任何点击开始了这种方式,在左侧后退按钮,没有取消右键:iOS:在导航栏中显示搜索栏时隐藏示波器栏

enter image description here

所以,给搜索栏当前的工作重点,而不攻,我试图在viewDidLoad中添加[_searchBar becomeFirstResponder];,它不起作用。接下来我想:

self.searchDisplayController.displaysSearchBarInNavigationBar = YES; 

搜索栏将在导航栏中显示的确但范围栏消失了,(为什么苹果WHY),有一个尴尬的差距。

enter image description here

我也试着子类UINavigationBar的,使之高。很容易改变它的大小,但内容对齐在栏的底部,并重叠任何你想添加的内容。

所以要重新迭代,当视图第一次出现时,我需要在导航栏中显示搜索栏,而不需要用户点击。我还应该指定这是在UITableViewController上(因为该页面有一个UIRefreshConrol),所以简单地将工具栏放在表视图上方不是一个选项。谢谢。

回答

4

tl; dr:不要。

你应该知道,加入UISearchBarUITableViewheaderView调用内UIKit便于隐藏在启动范围酒吧一些自定义代码。尽管在iOS 6和更旧的版本中,它一直很容易显示范围栏,但iOS 7已经改变了这一点。

你的第一种方法,becomeFirstResponderviewDidLoad是一个好主意,但是这个方法是在视图加载到内存之后调用的(比如在NIB之外)。该视图尚未添加到视图层次结构中,因此它不能成为第一响应者。 viewDidAppear:在之后被称为正确视图被加载到视图层次结构中,并且becomeFirstResponder实际上允许UISearchBar接收焦点。

范围栏本身是一个隐藏的(默认)子视图UISearchBar。您在技术上可以通过子视图循环并将其设置为不隐藏:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self recurseSubviewsForView:self.searchDisplayController.searchBar]; 
} 

- (void)recurseSubviewsForView:(UIView *)view 
{ 
    for (UIView *subview in view.subviews) { 
     if ((CGRectGetMinY(subview.frame) == CGRectGetMaxY(self.searchDisplayController.searchBar.frame)) && subview.hidden) { 
      subview.hidden = NO; 
      self.searchDisplayController.searchBar.showsScopeBar = YES; 
      [self.searchDisplayController.searchBar sizeToFit]; 
     } 
     [self recurseSubviewsForView:subview]; 
    } 
} 

这通常是一个坏主意。有一个基本的检查,看看作为目标的子视图是一个包含范围栏子视图,但可以打破任何一秒,可能不是向后兼容等

你要问自己真正的问题是为什么我希望范围栏始终可见吗?现在它的工作方式是,当用户点击搜索字段并在搜索字段不再具有焦点时隐藏自身,范围栏将显示动画。即使是上面的“黑客”,只要用户点击一个范围按钮,搜索栏就会获得焦点。当搜索甚至不活跃时,显示搜索选项的意义何在?如有疑问,回落到Apple的建议。从长远来看,它会让你的生活变得更加轻松,并且可能会让你的应用看起来更好,行为更好。苹果公司并不只是随心所欲地加入这种互动。他们像疯了一样测试它。这就是为什么要以另一种方式工作很难。这就是为什么当UISearchBarUITableViewheaderView ...时有特殊的代码运行,因为它对用户来说可能更好。另外,我看到你的屏幕截图为iOS 8,但你的代码缩减显示使用UISearchDisplayController。这种范例已被弃用,有利于UISearchController。请考虑更新。

+0

沮丧,我没有想'将'becomeFirstResponder'放在'viewDidAppear:'中。谢谢!回答你的问题:我希望它始终可见bc VC专门用于搜索。 (看看Instagram的搜索选项卡 - 这就是我所追求的)此外,有一个很好的理由使用“UISearchDisplayController” - 兼容iOS7。它可能会在iOS8中被弃用,但它仍然是完全有效的(并且仍然在IB中的对象库中)。问题仍然存在:如果您使用该选项在导航栏中显示搜索栏,为什么Apple会隐藏该范围,而不考虑设置'showsScope = YES'? – inorganik

+1

它为什么隐藏范围栏?我不知道,但[它被记录](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UISearchDisplayController_Class/index.html#//apple_ref/occ/instp/UISearchDisplayController/displaysSearchBarInNavigationBar )。 *“如果您在显示在导航栏中的搜索栏中将'showsScopeBar'属性设置为'YES',则系统会引发异常。”*可能因为导航栏高度不足以显示范围栏。 – greg