我在加载时显示带有搜索栏和范围栏按钮的UITableView。当用户点击示波器栏按钮时,将显示键盘并且搜索栏将获得焦点(成为第一响应者)。
是否可以允许使用示波器条按钮来过滤表项而不显示键盘?用户可以通过在搜索文本输入字段中专门点击来显示键盘。
答案 0 :(得分:5)
我的解决方案最后涉及在视图控制器上使用两个委托方法和一个状态变量。
在视图控制器上我添加了属性
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。通过这种方式,我可以防止焦点转到搜索栏。
答案 1 :(得分:1)
不确定。实现取决于您如何设置UITableView,但假设您正在使用NSFetchedResultsControllers,您可以这样做:
1)假设你有3个范围栏按钮;创建4个NSFRCs。
2)为前3个NSFRC创建获取请求,每个NSFRC都有一个谓词,只选择相应范围栏按钮的相关范围。
3)使用最终的NSFRC进行搜索功能。有关如何实施搜索的详细信息,请参阅How to filter NSFetchedResultsController (CoreData) with UISearchDisplayController/UISearchBar上的Brent Piddy的帖子。
4)当用户点击示波器栏按钮时,不将任何文本写入搜索栏,而只是交换相关的NFC。突出显示按钮(或考虑使用UISegmentedControl),以便用户可以看到他们正在查看的范围。
5)当用户在搜索栏中键入文本时,按照上面布伦特的帖子详细说明,在搜索栏NSFRC中进行交换。删除按钮或UISegmentedControl上的任何突出显示,并将搜索栏保留在屏幕上,并显示用户的文本,这样,他们就可以看到他们正在查看的范围。