最近在使用UISearchBar和UISearchDisplayController控件的时候,遇到了一些问题,但是在网络查找答案的过程中,发现网络上对于这两个空间的详细使用还没太全的资料,所以我对于自己这段时间解决的问题对这两个控件做一下详细解读。
先详细介绍一下这两个控件
一 、UISearchBar是一个继承于UIView的控件,既然是个view,它自身就会(也)包含了很多视图样式设置的方法,比如searchbar背景、scopeBar背景和searchbar上文字的设置。
searchbar实现搜索的原理是通过自身的delegate完成数据的查询并对相应的tableview进行reload操作。代码如下。
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
if (searchText != nil && searchText.length > 0)
{
self.marr = [NSMutableArray array];//这里可以说是清空tableview旧datasouce
for (NSString *str in _arr) {
if ([str rangeOfString:searchText options:NSCaseInsensitiveSearch].length > 0)//这里进行数据查询
{
[_marr addObject:str];
}
}
[_tbl_city reloadData];//重新加载tableview
}else{
self.marr = [NSMutableArray arrayWithArray:_arr];
[_tbl_city reloadData];
}
}
textDidChange方法(一下都对方法进行这样可识别的简写)是在每次在搜索框中输入数据的时候运行的。
searchbar自身带有4个按钮,这些按钮默认状态都是隐藏的。它们分别是 1.searchResultsButton 2.BookmarksButton 3.CancelButton 4.ScopeBar(它包含scopebarbutton)
searchBarSearchButtonClicked方法是对键盘上search键的点击事件,在这个方法中我们可以根据功能需求来完成一些操作,我在此对键盘进行了消失操作。
searchBarBookmarkButtonClicked方法是BookmarksButton的点击事件。
searchBarCancelButtonClicked方法是CancelButton的点击事件,一般取消按钮的方法中是对放弃搜索的逻辑操作,比如tableview的datasource恢复。
searchBarResultsListButtonClicked方法是searchResultsButton的点击事件。
selectedScopeButtonIndexDidChange:(NSInteger)selectedScope是scopebarbutton的点击事件。
通过delegate方法名字就能看出他们所代表意思,我们可以根据自己的业务需求来进行一些相关操作和数据处理。
二、UISearchDiplayController是一个继承于NSObject的控件,它本身包含UISearchBar,UITableView两个控件。它自身带的tableview我们为了与我们自己建的区别开来,俗称它为resultTableview。虽然这两个tableview不是同一个tableview,但是他们的delegate的内容和样式都与我们自己的tableview是相同的。
其中最重要的delegate就是一下所示的,搜索方法了,这个方法返回的是bool类型,无需开发者自己reload tableview,系统会自动加载tableview。
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
/// 筛选数据
if (searchString != nil && searchString.length > 0)
{
self.marr = [NSMutableArray array];
for (NSString *str in _arr) {
if ([str rangeOfString:searchString options:NSCaseInsensitiveSearch].length > 0)
{
[_marr addObject:str];
}
}
}
else
self.marr = [NSMutableArray arrayWithArray:_arr];
return YES;
}
- (void) searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller;
这是点击searchbar将要进行搜索时发生的方法,可以再次对cancelbutton样式进行更改。1
- (void) searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller;
这是点击searchbar已经进行搜索时发生的方法。2
- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView;
这是在所搜框中第一次输入数据时发生的方法,是resulttableview的加载方法。3
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString;
这是在所搜框中每次输入数据时发生的方法,可以说是对resulttableview进行reload的方法。4
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption;
这是点击scopebutton后出发的方法,方法返回YES后会对resulttableview进行reload的方法。4
- (void)searchDisplayController:(UISearchDisplayController *)controller willShowSearchResultsTableView:(UITableView *)tableView;
这是resulttableview将要show的方法,每次在所搜框中输入数据时发生的方法。5
- (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView;
这是 resulttableview已经show的方法,每次在所搜框中输入数据时发生的方法。6
- (void)searchDisplayController:(UISearchDisplayController *)controller willHideSearchResultsTableView:(UITableView *)tableView;
这是resulttableview将要hiden的方法,点击取消按钮或者把搜索框中数据全部删除时发生。7
- (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView;
这是 resulttableview已经hiden的方法,点击取消按钮或者把搜索框中数据全部删除时发生。8- (void) searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller;
这是在点击取消按钮之后将要发生的方法。9
- (void)searchDisplayController:(UISearchDisplayController *)controller willUnloadSearchResultsTableView:(UITableView *)tableView;
这是在点击取消按钮之后,发生的resultstableview卸载方法。10
- (void) searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller;
这是在点击取消按钮之后发生的方法。11
以上方法,后边的数字标号是我测试他们发生的先后顺序之后标注的,数字代表他们发生的先后顺序。如果在endsearch的时候resultstableview还没有hiden,这是将先发生willendsearch然后发生willhide和didhide,之后发生didend。
UISearchDisplayControlle
使用UISearchDisplayControlle
@implementation CustomDisplaySearchViewController
- (void)setActive:(BOOL)visible animated:(BOOL)animated {
[super setActive:visible animated:animated];
[self.searchContentsController.navigationController setNavigationBarHidden:NOanimated:NO];
}
@end
(UISearchDisplayControlle
- (void)searchDisplayController:(UISearchDisplayController *)controller willShowSearchResultsTableView:(UITableView *)tableView
{
for (UIView *subview in tableView.subviews) {
if ([subview isKindOfClass:[UILabel class]]) {
[(UILabel *)subview setText:@"无结果"];
}
}
}