三种搜索控件的实现方式:
自定义搜索控件
UISearchController(ios8以后)
UISearchDisplayController(ios8之前)
下面介绍UISearchController使用方法及注意事项:
// 实例化查询结果控制器,(这里一定是要先实例化查询结果控制器,因为创建搜索控制器的时候是要一有一个搜索结果控制器的,如果不按照这个顺序,先创建搜索控制器,这时候用来展示搜索结果的控制器是空,所以不会展示数据)
self.resultsController = [[XYResultTableViewController alloc] init];
// 实例化查询结果控制器,(这里一定是要先实例化查询结果控制器,因为创建搜索控制器的时候是要一有一个搜索结果控制器的,如果不按照这个顺序,先创建搜索控制器,这时候用来展示搜索结果的控制器是空,所以不会展示数据)
self.resultsController = [[XYResultTableViewController alloc] init];
// 实例化搜索控制器
self.searchController = [[UISearchController alloc] initWithSearchResultsController:_resultsController];
// 设置搜索框为tableView的头视图
self.searchController.searchBar.searchBarStyle = UISearchBarStyleProminent; // 设置搜索框的样式
self.tableView.tableHeaderView = self.searchController.searchBar;
// 设置搜索框的占位文字
self.searchController.searchBar.placeholder = @"微信号/手机号";
// 设置查询代理
self.searchController.delegate = self;
// 注意不要忘记设置查询更新结果的代理,这个代理的名字不按常规出牌
self.searchController.searchResultsUpdater = self;
// 弹出搜索框
[self presentViewController:self.searchController animated:YES completion:nil];
//是否添加半透明覆盖层
self.searchController.dimsBackgroundDuringPresentation = NO;
//是否隐藏导航栏
self.searchController.hidesNavigationBarDuringPresentation = YES;
//此处重要一步,将searbar显示到界面上,已经设置为tableHeaderView就不需要了
// [self.view addSubview:_searchController.searchBar];
[_searchController.searchBar setValue:@"取消" forKey:@"_cancelButtonText"];
// 另外需要注意在合适的地方添加下面一行代码,很重要,今天搜索框弹出来后就跟随导航条消失了,郁闷了半天,才找到这个数据
self.definesPresentationContext = YES;
这行代码是声明,哪个viewcontroller显示UISearchController,苹果开发中心的demo中的对这行代码,注释如下
// know where you want UISearchController to be displayed
a、如果不添加上面这行代码,在设置hidesNavigationBarDuringPresentation这个属性为YES的时候,搜索框进入编辑模式会导致,searchbar不可见,偏移-64;
在设置为NO的时候,进入编辑模式输入内容会导致高度为64的白条,猜测是导航栏没有渲染出来
b、如果添加了上面这行代码,在设置hidesNavigationBarDuringPresentation这个属性为YES的时候,输入框进入编辑模式正常显示和使用;在设置为NO的时候,搜索框进入编辑模式导致向下偏移64,具体原因暂时未找到