UISearchController 基础使用
在最近的学习中,需要用到搜索框UISearchController,但是在网上或者教材上没有看到相关资料,只有UISearchDisplayController这个被弃用的控件,于是自己琢磨了下弄出来了。
我想实现的功能是这样的,在主视图中有一个UISearchBar,当这个UISearchBar获得焦点开始输入时UISearchController就会开始呈现并获得焦点,所以在个实现过程如下:
首先在主视图中添加UISearchBar,这个很简单
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(navigationBar.frame), _mainSize.width, navigationBarHeight/1.2)];
searchBar.tag = 10001;
searchBar.delegate = self;
searchBar.placeholder = @"邮箱账号/手机账号/群号/生活服务";
[self.view addSubview:searchBar];
这个时候在主视图久存在一个搜索框了,然后我们要添加协议UISearchBarDelegate,并去实现搜索框的代理方法searchBarTextDidBeginEditing:,该方法是搜索框获得焦点时触发的一个事件,在该事件内我们这样写:
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
resultTableViewController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];
resultTableViewController.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
resultTableViewController.tableView.dataSource = self;
resultTableViewController.tableView.delegate = self;
searchContro = [[UISearchController alloc] initWithSearchResultsController:resultTableViewController];
searchContro.searchResultsUpdater = self;
searchContro.searchBar.tag = 10002;
searchContro.searchBar.autocapitalizationType = UITextAutocapitalizationTypeNone;
searchContro.searchBar.placeholder = @"邮箱账号/手机账号/群号/生活服务";
searchContro.searchBar.prompt = @"请输入要查找的信息";
[self presentViewController:searchContro animated:YES completion:nil];
}
在该方法去编写UISearchController的呈现状态,其中resultTableViewController用来呈现搜索输入提示语或者搜索结果,将其的代理设置好,接下来就是本文的主菜,我们去实现UISearchController,将其结果显示设置为resultTableViewController,设置好更新结果视图代理,同时去实现resultTableViewController的各种代理方法,这里不多做累赘,需要做的有:提示语或结果显示行数,实现cell的不同内容,如果是提示语则cell的点击将内容填充到searchContro.searchBar.text中去,不同的cell高度,当然,还有你的提示语依据当前输入字符的变化而变化的方法。
当这些做完之后你会发现我的视图可以正确显示,提示语也可以正确显示,正确填充,但是为什么我点击虚拟键盘的search键他没有反应呢(实现searchBarSearchButtonClicked:方法),这个问题弄了比较久,我一直在纠结为什么没反应,我一开始是以为是searchContro.searchBar的代理没有设置,设置后运行,但是在第二个输入框获得焦点时报错了,问别人所示模态覆盖,我也不知道是啥,总之不能实现,那恩么办呢。
后来我突然想到,在主视图,我也有这么一个搜索框,是不是这两个搜索框的焦点获得出线覆盖从而混乱了呢?然后我就在搜索框获得焦点事件中添加了一个判断,如果当前搜索框式主视图的则开始创建弹出视图,并且,当前搜索框失去键盘第一响应者身份,同时在创建弹出视图过程中设置searchContro.searchBar的代理,并让其获得第一键盘响应者身份,然后再键盘响应中依据当前唤醒键盘的是哪个搜索框,并作不同的事情
ok,这样就解决了,总而言之,还是学习得不够,对他们的工作原理不是很了解。。