美文网首页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