我正在尝试获取一个搜索栏及其在导航栏中的范围,就像 View 首次出现的方式一样。如果您只是将 UISearchBar 拖到界面生成器中的 TableView Controller 上,它就会像标题单元格一样放置在您的表中。然后,当你点击它时,它会动画化成我在下方追踪的阵型。问题是我希望它在没有任何点击的情况下以这种方式开始,左侧有一个后退按钮,右侧没有取消按钮:
因此,为了让搜索栏在不点击的情况下立即获得焦点,我尝试在 viewDidLoad 中添加 [_searchBar becomeFirstResponder];
但这不起作用。接下来我尝试了:
self.searchDisplayController.displaysSearchBarInNavigationBar = YES;
搜索栏确实会显示在导航栏中,但范围栏不见了,(WHY APPLE WHY) 并且有一个尴尬的差距。
我也尝试过子类化 UINavigationBar 并使其更高。更改它的大小很容易,但内容在栏的底部对齐并与您尝试添加的任何内容重叠。
因此,为了重新迭代,我需要在 View 首次出现时将搜索栏显示在带有范围控件的导航栏中,而无需用户点击。我还应该指定这是在 UITableViewController 上(因为页面有 UIRefreshConrol),所以简单地将工具栏放在 TableView 上方不是一个选项。谢谢。
最佳答案
tl;dr: 不要。
您应该知道,将 UISearchBar
添加到 UITableView
的 headerView
会调用 UIKit
中的一些自定义代码这有助于在开始时隐藏范围栏。虽然过去在 iOS 6 及更早版本中始终更容易显示范围栏,但 iOS 7 改变了这一点。
您的第一种方法,在 viewDidLoad
中 becomeFirstResponder
是个好主意,但此方法在 View 加载到内存后调用(例如从 NIB 中加载).该 View 还没有被添加到 View 层次结构中,所以它不能成为第一响应者。 viewDidAppear:
在 View 加载到 View 层次结构中后 立即调用,becomeFirstResponder
实际上允许 UISearchBar
接收焦点。
范围栏本身是 UISearchBar
的隐藏(默认情况下) subview 。从技术上讲,您可以循环浏览 subview 并将其设置为不隐藏:
- (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];
}
}
这通常是个坏主意。有一个基本检查来查看目标 subview 是否是包含范围栏的 subview ,但这可能随时中断,可能不向后兼容等。
您必须问自己的真正问题是为什么我希望范围栏始终可见?它现在的工作方式是,当用户点击搜索字段时,范围栏将显示动画,并在搜索字段不再具有焦点时隐藏自身。即使使用上面的“hack”,搜索栏也会在用户点击范围按钮后立即获得焦点。当搜索甚至不活跃时显示搜索选项有什么意义?如有疑问,回到 Apple 的建议。从长远来看,这会让您的生活更轻松,并且可能会让您的应用程序看起来和运行得更好。 Apple 并不是一时兴起就添加了这种交互。他们疯狂地测试它。这就是为什么很难让它以另一种方式工作的原因。这就是当 UISearchBar
是 UITableView
的 headerView
时运行特殊代码的原因...因为它可能对用户更好。
此外,我看到你的屏幕截图针对的是 iOS 8,但你的代码片段显示使用 UISearchDisplayController
。此范例已被弃用,取而代之的是 UISearchController
.请考虑更新。
关于iOS:在导航栏中显示搜索栏时隐藏范围栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27697065/