#import "ViewController.h"@interface ViewController ()@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]; */