#import "ViewController.h" @interface ViewController ()<UITableViewDelegate,UITableViewDataSource,UISearchBarDelegate,UISearchControllerDelegate,UISearchResultsUpdating> @property (nonatomic, strong) UITableView *myTableView; @property (nonatomic, strong) NSMutableArray *visableArray; @property (nonatomic, strong) NSMutableArray *filterArray; @property (nonatomic, strong) NSMutableArray *dataSourceArray; @property (nonatomic, strong) UISearchController *mySearchController; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [self initial]; } - (void)initial{ self.dataSourceArray = [NSMutableArray array]; self.filterArray = [NSMutableArray array]; for (int i = 0; i < 26; i++) { for (int j = 0; j < 4; j++) { NSString *str = [NSString stringWithFormat:@"%c%d", 'A'+i, j]; [self.dataSourceArray addObject:str]; } } self.visableArray = self.dataSourceArray; self.myTableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; _myTableView.delegate = self; _myTableView.dataSource = self; [self.view addSubview:_myTableView]; //nil为和当前视图总用一个视图 self.mySearchController = [[UISearchController alloc] initWithSearchResultsController:nil]; //searchResultsUpdater:设置显示搜索结果的控制器 _mySearchController.searchResultsUpdater = self; /** * @author aiqing, 17-11-19 16:11:58 *若是不须要,刻意再建立一个如 UITableViewController *tableVC = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain]; tableVC.tableView.delegate = self; tableVC.tableView.dataSource = self; [tableVC.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"]; self.searchVC = [[UISearchController alloc] initWithSearchResultsController:tableVC]; * */ //dimsBackgroundDuringPresentation设置开始搜索时背景显示与否 _mySearchController.dimsBackgroundDuringPresentation = YES; //[searchBar sizeToFit]:设置searchBar位置自适应 [_mySearchController.searchBar sizeToFit]; //.设置searchBar为UITableView的头部视图 self.myTableView.tableHeaderView = self.mySearchController.searchBar; //加上这个self.searchController.hidesNavigationBarDuringPresentation = NO;就不会自动隐藏导航了 // [self willPresentSearchController:self.mySearchController]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ if (!_visableArray || _visableArray.count == 0) { _visableArray = _dataSourceArray; } return _visableArray.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"identifier"]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"identifier"]; } cell.textLabel.text = [_visableArray objectAtIndex:indexPath.row]; return cell; } /** * @author aiqing, 17-11-19 15:11:55 * * 搜索功能的最重要一步了 * * @param searchController 匹配搜索结果 */ - (void)updateSearchResultsForSearchController:(UISearchController *)searchController{ NSString *filterString = searchController.searchBar.text; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains [c] %@", filterString]; self.visableArray = [NSMutableArray arrayWithArray:[self.dataSourceArray filteredArrayUsingPredicate:predicate]]; [self.myTableView reloadData]; /** * @author aiqing, 17-11-19 16:11:48 * * 接上面自定义searchbar添加表视图 * * @param UITableViewController 从新加载数据源 * * @return 新的表示图 */ //最后搜索数据源变了 ->让搜索控制器 内部的结果视图控制器的tableView的刷新 //UITableViewController *tableVC = (UITableViewController *)searchController.searchResultsController; //[tableVC.tableView reloadData]; } - (void)willPresentSearchController:(UISearchController *)searchController { NSLog(@"searchController 将要 显示"); } - (void)didPresentSearchController:(UISearchController *)searchController { NSLog(@"searchController 已经 显示"); } - (void)willDismissSearchController:(UISearchController *)searchController { NSLog(@"searchController 将要 消失"); } - (void)didDismissSearchController:(UISearchController *)searchController { NSLog(@"searchController 已经 消失"); } /** * @author aiqing, 17-11-19 16:11:04 * * !!若是须要页面跳转 在进行页面跳转的时候要注意如今有两个视图呀须要区分开 UIViewController *vc = nil; //self.presentedViewController获取已经模态跳转上册的视图控制器,若是dismiss 以后 这个值会变成nil if (self.presentedViewController) { //判断一下 当前视图控制器有没有 模态跳转 的视图,若是有 那么 作另一个模态跳转的时候 应该用 上一个已经模态跳转的控制器进行 模态跳转下一个 vc = self.presentedViewController; }else { vc = self; } //模态跳转 [vc presentViewController:alert animated:YES completion:nil]; */