#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]; */