我在加载时显示带有搜索栏和范围栏按钮的 UITableView。当用户点击范围栏按钮时,将显示键盘并且搜索栏获得焦点(成为第一响应者)。
是否可以允许使用范围栏按钮来过滤表格项目而不出现键盘?用户可以通过在搜索文本输入字段中专门点击来显示键盘。
我在加载时显示带有搜索栏和范围栏按钮的 UITableView。当用户点击范围栏按钮时,将显示键盘并且搜索栏获得焦点(成为第一响应者)。
是否可以允许使用范围栏按钮来过滤表格项目而不出现键盘?用户可以通过在搜索文本输入字段中专门点击来显示键盘。
我最终的解决方案涉及在视图控制器上使用两个委托方法和一个状态变量。
在视图控制器上,我添加了属性
NSNumber *scopeButtonPressedIndexNumber;
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar {
if (self.scopeButtonPressedIndexNumber != nil) {
self.scopeButtonPressedIndexNumber = nil; //reset
return NO;
}
else {
return YES;
}
}
- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope {
self.scopeButtonPressedIndexNumber = [NSNumber numberWithInt:selectedScope];
}
本质上,如果按下了范围按钮,我会捕获,如果是这种情况,我会在 shouldBeginEditing 中返回 NO。通过这种方式,我能够防止焦点转到搜索栏。
当然。实现取决于您如何设置 UITableView,但假设您使用的是 NSFetchedResultsControllers,您可以这样做:
1)假设您有 3 个范围栏按钮;创建 4 个 NSFRC。
2) 为前 3 个 NSFRC 创建 fetch 请求,每个请求都带有一个谓词,用于仅选择相应范围栏按钮的相关范围。
3) 使用最终的 NSFRC 进行搜索功能。请参阅 Brent Piddy 关于如何使用 UISearchDisplayController/UISearchBar 过滤 NSFetchedResultsController (CoreData)的帖子,以了解有关如何实现搜索的详细信息(如果您尚未这样做)。
4)当用户点击范围栏按钮时,不要在搜索栏中写任何文本,而只是交换相关的 NFC。突出显示按钮(或考虑使用 UISegmentedControl),以便用户可以看到他们正在查看的范围。
5)当用户在搜索栏中输入文本时,在搜索栏中交换 NSFRC,如上面布伦特的帖子中所述。删除按钮或 UISegmentedControl 上的任何突出显示,并将搜索栏与用户的文本一起留在屏幕上,这样他们就可以再次看到他们正在查看的范围。