iOS中的两种搜索方式UISearchDisplayController和UISearchController
2017-07-18 20:59
429 查看
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
假设认为写的不好请多提意见,假设认为不错请多多支持点赞.谢谢! hopy ;)
曾经iOS的搜索一般都使用UISearchDisplayController来完毕,只是自从iOS 8.0開始,该控制器被标记为废弃,我们能够在iOS 8.0之后使用一个新的搜索控制器UISearchController来完毕搜索.
本篇博文将介绍以上2种搜索控制器的简单用法,并比較它们的差别.Let’t Go!
UISearchDisplayController
使用该控制器我们必须给根控制器加入一个UISearchDisplayDelegate协议,然后完毕其规定的几个回调方法:-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{ [_filteredNames removeAllObjects]; if (searchString.length > 0) { NSPredicate *predicate = [NSPredicate predicateWithBlock: ^BOOL(NSString *name,NSDictionary *b) { NSRange range = [name rangeOfString:searchString options:NSCaseInsensitiveSearch]; return range.location != NSNotFound; }]; for (NSString *key in _keys) { NSArray *matchs = [_names[key] filteredArrayUsingPredicate:predicate]; [_filteredNames addObjectsFromArray:matchs]; } } return YES; } -(void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView{ [tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:SectionsTableID]; }
当中第一个方法在搜索关键字发生改变时调用,后一个则在搜索表视图载入完毕后调用,我们能够看见如上代码所看到的,我们在搜索表视图载入后将其表视图的UITableViewCell元素的ID和一个特定的ID绑定,这样做能够重用已存在的单元格.另外须要注意的是该ID和根视图控制器中标示图的单元格ID是一样的,尽管这两个表视图是不一样的.
我们在根视图控制器的didLoadView中用以下代码初始化UISearchDisplayController:
UISearchBar *searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0, 0, 320, 44)]; tableView.tableHeaderView = searchBar; _searchController = [[UISearchDisplayController alloc]initWithSearchBar:searchBar contentsController:self]; _searchController.delegate = self; _searchController.searchResultsDataSource = self;
以上代码首先创建一个searchBar并将其设置为tableView的表头视图,接着以该searchBar为參数创建UISearchDisplayController对象,最后设置好其相应的托付.
由于此时根视图中存在2个表视图,所以我们在处理相关回调方法时要区分当前处理的是哪张表视图:
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ if (tableView.tag == 1) { return _keys.count; }else{ return 1; } }
我们将默认的呈现数据的表视图的tag设置为1,这样我们就知道当前须要处理的是哪张表视图了.其他的回调与此相似,不再一一述及.
UISearchController
以下我们来看看iOS 8.0之后新的搜索器类的用法.首先我们也必须加入一个UISearchResultsUpdating协议,同一时候实现一个协议方法:-(void)updateSearchResultsForSearchController:(UISearchController *)searchController;
该方法和前一个搜索器类的方法相似,只是要注意的是它不返回值,这意味着假设你想要显示搜索结果,你必须手动刷新表视图.以下给出一个该方法的样例:
-(void)updateSearchResultsForSearchController:(UISearchController *)searchController{ NSString *searchString = _searchController.searchBar.text; [_filteredNames removeAllObjects]; if (searchString.length > 0) { NSPredicate *predicate = [NSPredicate predicateWithBlock: ^BOOL(NSString *name,NSDictionary *b) { NSRange range = [name rangeOfString:searchString options:NSCaseInsensitiveSearch]; return range.location != NSNotFound; }]; for (NSString *key in _keys) { NSArray *matchs = [_names[key] filteredArrayUsingPredicate:predicate]; [_filteredNames addObjectsFromArray:matchs]; } }else{ //假设搜索关键字为空则显示全部key for (NSString *key in _keys) { NSArray *matchs = _names[key]; [_filteredNames addObjectsFromArray:matchs]; } } UITableView *tableView = [self.view viewWithTag:1]; //手动刷新表视图 [tableView reloadData]; }
UISearchController另一个和UISearchDisplayController不同的地方,就是推断当前表视图是否是搜索表视图的方法:
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ if (_searchController.active) { return 1; }else{ return _keys.count; } }
好吧,我收回上面的话…准确来说,应该是前者根本没有自己的表视图,它使用的表视图就是默认的表视图.也就是我们必须自默认的表视图中推断当前搜索是否激活,假设是则显示搜索后的结果,否则显示默认呈现的数据.
最后我们来看看,怎样初始化UISearchController:
_searchController = [[UISearchController alloc]initWithSearchResultsController:nil]; _searchController.searchResultsUpdater = self; _searchController.dimsBackgroundDuringPresentation = NO; _searchController.hidesNavigationBarDuringPresentation = NO; tableView.tableHeaderView = _searchController.searchBar;
大家能够看到不用再自己创建UISearchBar对象了,UISearchDisplayController已经帮你搞定了.
总结
最后我们来看一下以上2种搜索控制器的不同:前者使用单独的表视图,后者没有表视图,其内容使用默认的表视图来呈现.
前者须要手动创建UISearchBar对象,而后者不须要
前者须要在表示图的协议回调中推断当前是哪个表视图,而后者仅仅是简单推断搜索是否处在激活状态
它们遵守的协议不一样,协议方法自然也不一样
前者比較复杂,后者更简单,从类的构成上来说也更合理.
相关文章推荐
- iOS中的两种搜索方式UISearchDisplayController和UISearchController
- iOS中的两种搜索方式UISearchDisplayController和UISearchController
- iOS中的两种搜索方式UISearchDisplayController和UISearchController
- ios UISearchDisplayController 实现 UITableView 搜索功能
- iOS之iPhone手机通讯录和短信搜索界面的实现以及UISearchController和UISearchDisplayController的浅析
- IOS-模糊搜索UISearchBar+UISearchDisplayController
- ios UISearchDisplayController 实现 UITableView 搜索功能 UISearchDisplayController 是苹果专为 UITableView 搜索封装
- iOS应用中UISearchDisplayController搜索效果的用法
- UISearchDisplayController(iOS < 8.0)实例应用实现搜索功能和VC展示效果, 以及代理方法的介绍
- iOS--搜索UISearchController&&UISearchDisplayController
- ios笔记之- UISearchDisplayController 无搜索结果下的文字定义
- IOS UISearchDisplayController 点击搜索出现黑条问题解决方案
- iOS之默认搜索UISearchDisplayController
- ios UISearchDisplayController 实现 UITableView 搜索功能
- ios UISearchDisplayController 实现 UITableView 搜索功能
- IOS UISearchDisplayController 点击搜索出现黑条问题解决方案
- ios UISearchDisplayController 实现 UITableView 搜索功能
- ios UISearchDisplayController 实现 UITableView 搜索功能
- ios UISearchDisplayController 实现 UITableView 搜索功能
- ios UISearchDisplayController 实现 UITableView 搜索功能