iOS中有多种实现搜索功能的方法,这里我们用系统提供的原生的类(UISearchController)来实现以下,相对来说还是很简单的。
效果图为:
废话补多说,上代码:
首先我们要有个一个展示数据的tableView,我这里叫JYTableViewController。
然后在
#import "JYTableViewController.h"里实例化两个控制器和一个用来存放数据的数组
// 查询控制器
@property (nonatomic,strong)UISearchController *searchController;
// 查询结果控制器
@property (nonatomic,strong)JYResultTableViewController *resultsController;
// 展示数据的数组
@property (nonatomic,strong)NSMutableArray *dataArray;
我这里通过懒加载创建数组并对其进行赋值:
// 懒加载要展示数据的数组
-(NSArray *)dataArray{
if (!_dataArray) {
_dataArray = [NSMutableArrayarrayWithCapacity:20];//这个数量没什么用,但是要注意创建的数组是可变的
// for循环添加数据
for (int i =0; i < 20; i++) {
[_dataArrayaddObject:[NSStringstringWithFormat:@"%@ --> %d",@"BlackSky",i]];
}
}
return_dataArray;
}
下面代码都有很详细的注释,我就不一一解释了
- (void)viewDidLoad {
[superviewDidLoad];
// 实例化查询结果控制器,(这里一定是要先实例化查询结果控制器,因为创建搜索控制器的时候是要一有一个搜索结果控制器的,如果不按照这个顺序,先创建搜索控制器,这时候用来展示搜索结果的控制器是空,所以不会展示数据)
self.resultsController = [[JYResultTableViewControlleralloc]init];
// 实例化搜索控制器
self.searchController = [[UISearchControlleralloc]initWithSearchResultsController:_resultsController];
// 设置搜索框为tableView的头视图
self.tableView.tableHeaderView =self.searchController.searchBar;
// 设置查询代理
self.searchController.delegate =self;
// 注意不要忘记设置查询更新结果的代理,这个代理的名字不按常规出牌
self.searchController.searchResultsUpdater =self;
}
#pragma mark - Table view data source
// 返回组数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return1;
}
// 返回每组的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
returnself.dataArray.count;
}
// 返回cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:reuseIdentifier];
if (!cell) {
cell = [[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:reuseIdentifier];
}
cell.textLabel.text =self.dataArray[indexPath.row];
return cell;
}
// 实现查询结果处理的代理方法,注:这是一个必须实现的方法。
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController{
// 设置谓词,谓词就是根据输入的内容去匹配数据,并返回一个查询的结果
NSPredicate *predicate = [NSPredicatepredicateWithFormat:@"SELF CONTAINS[c] %@",self.searchController.searchBar.text];
// 设置查询结果界面要显示的数据
// self.resultsController.serachResults = [NSMutableArray arrayWithArray:[self.dataArray filteredArrayUsingPredicate:predicate]];
NSMutableArray *array = [NSMutableArrayarrayWithArray:[self.dataArrayfilteredArrayUsingPredicate:predicate]];
self.resultsController.serachResults = array;
// 不要忘记刷新结果数据界面
[self.resultsController.tableViewreloadData];
}
然后就是展示结果的tableView的控制器用来显示数据,
@interface JYResultTableViewController :UITableViewController
// 查询结果控制器
@property (nonatomic,strong)NSArray *serachResults;//注,此属性写在.h文件里,为了外界访问
@end
.m文件里就根据serachResults数组里的匹配数据进行相应展示就好。