UISearchDisplayController 的使用
最后更新于:2022-04-01 06:58:56
@借用一组图,来展示下UISearchDisplayController : 比如:搜索"万通",弹出一个tableView 显示出检索有这2个字的地点
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-12_5694d75245ffd.jpg)
@UISearchDisplayController(搜索显示控制器)详解:
1.继承于NSObject,它并不是一个视图控制器,只是一个类,一个工具类
2.提供一个searchBar和一个搜索结果tableView
3.searchBar需要我们自己创建,添加到指点视图,提供给UISearchDisplayController
4.搜索结果tableView由搜索控制器进行搜索后要显示结果的时候创建,我们要制定一个 UIViewController负责显示,并实现它的代理,指定delegate,dataSource(也就是,它会有2 个tableView,一个是需要显示结果的时候才建立-----对应上图第三个,一个是初始化的时 候就已经存在-----对应上图第一个,但都是由同一个UIViewController控制)
5.设置自身代理UISearchDisplayDelegate
@代码举例:(初始化)
~~~
// 1.创建一个UISearchBar,添加在tableView上面
UISearchBar * searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0,0, 320, 80)];
searchBar.placeholder = @"国家名";
self.tableView.tableHeaderView = searchBar;
// 2.用创立的searchBar和UIViewController的view初始化出UISearchDisplayController
_searchDC = [[UISearchDisplayController alloc]initWithSearchBar:searchBar contentsController:self];
// 3.设置代理
_searchDC.searchResultsDelegate = self;
_searchDC.searchResultsDataSource = self;
_searchDC.delegate = self;
~~~
@代码举例:(如何区分2个tableView)
~~~
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// searchResultsTableView属性,will return non-nil. create if requested
if([tableView isEqual:self.searchDC.searchResultsTableView]){
return 1;
};
// tableView == self.tableView
return 1;
}
~~~
@至于如何检索出想要的结果(图示3),执行下面的代理方法后,用数组self.searchResults跟往常基本的UITableView赋值步骤一样,只是多了区分哪个tableView
~~~
现在来实现当搜索文本改变时的回调函数。这个方法使用谓词进行比较,并讲匹配结果赋给searchResults数组:
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope {
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@",searchText];
self.searchResults = [self.allItems filteredArrayUsingPredicate:resultPredicate];
}
//接下来是UISearchDisplayController的委托方法,负责响应搜索事件:
#pragma mark - UISearchDisplayController delegate methods
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
[self filterContentForSearchText:searchString scope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
return YES;
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
[self filterContentForSearchText:[self.searchDisplayController.searchBar text] scope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];
return YES;
}
~~~
@这是网上总结出的3点不足,链接http://blog.sina.com.cn/s/blog_759d3e1201017zsi.html
~~~
3.不足之处
UISearchDisplayController从我使用过程中,感觉到有三点不足。
(1)使用UISearchDisplayController当键盘弹出来的时候,会默认把navagationBar给隐藏起来。如果不需要隐藏navagationBar,最好的处理方式就是重写UISearchDisplayController的-(void)setActive:(BOOL)visible animated:(BOOL)animated方法:
自定义一个类CustomSearchDisplayController,继承自UISearchDisplayController,然后在.m文件中重写该方法,并在该方法中主动显示navagationBar。
@implementation CustomDisplaySearchViewController
- (void)setActive:(BOOL)visible animated:(BOOL)animated {
[super setActive:visible animated:animated];
[self.searchContentsController.navigationController setNavigationBarHidden:NOanimated:NO];
}
@end
(2)UISearchDisplayController的tableView有一个标签,当没有匹配的结果时,默认会在tableView上显示一个“No Result”的标签。如果说想自定义这个标签,可以通过循环遍历出tableView上标签。
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchString {
for (UIView* v in self.customDisplaySearch.searchResultsTableView.subviews) {
if ([v isKindOfClass: [UILabel class]] &&
[[(UILabel*)v text] isEqualToString:@"No Results"]) {
UILabel *label = (UILabel *)v;
label.text = @"没有结果";
break;
}
}
return YES;
}
(3)UISearchDisplayController的UISearchBar输入框当无输入时,SearchResultsTableView无法根据个人需求让表展示出来。我尝试过通过点击搜索栏delegate方法中去处理表展示问题,可是尝试失败了。
~~~