美文网首页iOS开发UIKitiOS专题
UISearchController的简单实用

UISearchController的简单实用

作者: 芝麻绿豆 | 来源:发表于2015-11-13 18:54 被阅读2443次

UISearchController的简单介绍

UISearchController是iOS8开始实用的搜索框,iOS8以前是UISearchBar和UISearchDispalyController结合使用。
UISearchController继承UIViewController,同时结合UINavigationController和UITableViewController实现搜索功能。


效果预览

简单使用

创建显示结果的tablview,将tableview添加到导航控制器的栈顶控制器:

  • 自定义类方法初始化UISearchController:
    rootController为显示结果的UITableViewController
+(instancetype)searchNavController:(UIViewController *)rootController{
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:rootController];
    navController.view.backgroundColor = YANColorBg;
    return [[self alloc] initWithSearchResultsController:navController];
}
  • 添加searchBar
self.tableView.tableHeaderView = self.searchController.searchBar;
  • 设置代理
self.searchController.searchResultsUpdater = self;
  • 实现代理方法:
    • 点击搜索框调用此方法;
    • 获取搜索框输入的文字
    • 将遍历的结果赋值到栈顶的tableview显示结果
  -(void)updateSearchResultsForSearchController:(UISearchController *)searchController{
      NSString *searchText = searchController.searchBar.text;
      YANLog(@"%@",searchText);
      [self updateFilteredContentForName:searchText];
      if (self.searchController.searchResultsController) {
        // 设置显示搜索结果的tableView
        UINavigationController *nav = (UINavigationController *)self.searchController.searchResultsController;
        YANSearchTableController *searchTable = (YANSearchTableController *)nav.topViewController;
        searchTable.tags = self.searchResult;
        [searchTable.tags insertObject:searchText atIndex:0];
        [searchTable.tableView reloadData];
    }
}
  • 遍历结果集的函数
    • self.tags :网络获取的数据存储在对应的模型
    • self.searchResult:将从模型中遍历出的结果存在临时的数组中
  -(void)updateFilteredContentForName:(NSString *)tagName{
     if (tagName == nil || tagName.length == 0) {
        NSMutableArray *searchResult = [NSMutableArray array];
        self.searchResult = searchResult;
        return;
    }
    // 移除之前的查询结果
    [self.searchResult removeAllObjects];
    // 遍历模型数据
    for (YANTag *tag in self.tags) {
        NSUInteger searchOptions = NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch;
        NSRange productNameRange = NSMakeRange(0, tag.theme_name.length);
        NSRange foundRange = [tag.theme_name rangeOfString:tagName options:searchOptions range:productNameRange];
        if (foundRange.length > 0) {
            [self.searchResult addObject:tag];
        }
    }
}
  • 栈顶控制器YANSearchTableController的设置
  • UISearchController的searchBar的代理方法和属性设置
  • 设置searcherBar的介绍请参考上篇文章
  • 点击search的代理方法实现网络请求获取查询数据
-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
    NSString *searchText = searchBar.text;
    NSString *url = @"http://api.budejie.com/api/api_open.php";
    NSDictionary *params = @{
                             @"a":@"tag_search",
                             @"c":@"topic",
                             @"kw":searchText
                             };
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager GET:url parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
        if (responseObject == nil) {
            [SVProgressHUD showErrorWithStatus:@"数据加载失败"];
        }
        UINavigationController *nav = (UINavigationController *)self.searchResultsController;
        YANSearchTableController *tableController = (YANSearchTableController *)nav.topViewController;
        tableController.tags = [YANTag objectArrayWithKeyValuesArray:responseObject];
        [tableController.tags insertObject:searchText atIndex:0];
        [tableController.tableView reloadData];
    } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
        if (error.code == NSURLErrorCancelled) return;
        if (error.code == NSURLErrorTimedOut) {
            [SVProgressHUD showErrorWithStatus:@"网络请求超时,请稍后再试"];
        }else{
            [SVProgressHUD showErrorWithStatus:@"网络请求失败"];
        } 
    }];
}

相关文章

网友评论

  • 灵儿菇凉:您好,如果导航栏是自定义的,点击取消回到搜索控制器时系统的导航栏出来了,请问这个问题您碰到过吗?
    芝麻绿豆:@灵儿菇凉 那就在导航栏跟控制器设置隐藏,然后继承这个导航栏控制器
    灵儿菇凉:会闪现一下。系统的会闪一下然后消失:disappointed_relieved:
    芝麻绿豆:@灵儿菇凉 在即将显示控制器view的时候记得把系统的导航栏隐藏试试!
  • WeiHing:想请教一下,类似淘宝京东电商平台的,在搜索框输入文字后在下方tableview cell显示相关结果的效果(类似自动补全?),是通过网络请求后台数据实现的么?尝试了把网络断开再输入搜索文字,这种情况下不会显示即时相关结果的。小白不太懂
    芝麻绿豆:@星星星星儿 这个可以是网络也可以是本地!要看你项目需求啦!
  • feibum:有Demo提供下载吗:flushed:
    非夜:@feibum Have a look at https://github.com/guoranliaoran/FYSearchViewControllorDemo
  • iOS程序犭袁:学习了
  • 389c20d5a244:很棒!
  • 49c9990ff26c:怎么做到点击搜索框看到搜索记录?
    芝麻绿豆:@_mry 搜索记录存到沙盒里!点击的时候在最上面的tableview显示数据!每次去沙盒里取就可以了!本文点击的时候没有显示数据,设置一下初始化的数据就可以了
  • 49c9990ff26c:怎么添加一个历史数据的列表?
    芝麻绿豆:@_mry 把搜索记录存起来 每次搜索的时候显示,要搜索新的时候就把数据覆盖

本文标题:UISearchController的简单实用

本文链接:https://www.haomeiwen.com/subject/upxkhttx.html