zoukankan      html  css  js  c++  java
  • iOS搜索框

    在iOS8以前搜索框是作为一个控件添加到TableViewController中,
    有系统自带的搜索变量self.searchDisplayController
    遵守一个搜索显示的协议<UISearchDisplayDelegate>,实现方法就可以了。
    在ProductTableViewController.m文件中
    #import "ProductTableViewController.h"
    #import "Product.h"
    @interface ProductTableViewController ()<UISearchDisplayDelegate>
    @property(nonatomic,strong)NSArray *allProducts;
    //用于存储搜索结果的数组
    @property(nonatomic,strong)NSMutableArray *resultProducts;
    @end
    @implementation ProductTableViewController
    - (NSArray *)allProducts{
        if(!_allProducts){
            _allProducts = [Product demoData];
        }
        return _allProducts;
    }
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.resultProducts = [NSMutableArray array];
        // 为用于展示搜索结果的表格注册单元格
        [self.searchDisplayController.searchResultsTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];
       
    }
    #pragma mark - Table view data source
    //实现tableView的三问
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        return 1;
    }
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        if(tableView==self.searchDisplayController.searchResultsTableView){
            return self.resultProducts.count;
        }else{
            return self.allProducts.count;
        }
    }
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
        Product *p = nil;
        if(tableView==self.tableView){
            p = self.allProducts[indexPath.row];
        }else{
            p = self.resultProducts[indexPath.row];
        }
        cell.textLabel.text = p.name;
        return cell;
    }
    实现协议:
    //只要在搜索框中修改搜索的内容,立即调用此方法,参数searchString就是用户此时在搜索框中输入的文本
    - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{
        NSMutableArray *tempArray = [NSMutableArray array];
        //获取此时在searchBar的scope中哪个按钮被选中
        NSInteger selectedScope = self.searchDisplayController.searchBar.selectedScopeButtonIndex;
        for (Product *p in self.allProducts) {
    //判断输入的searchString是否在p的name中出现了,NSRange包含两部分,一个是location,一个是length,location记录的时在name中包含searchString的位置,length记录占用的长度;通过判断range中得length,如果长度为0 则代表name不包含search。
            NSRange range = [p.name rangeOfString:searchString];
            if(range.length>0 && p.type==selectedScope){
                [tempArray addObject:p];
            }
        }
        self.resultProducts = tempArray;
        return YES;
    }
    //选定的scope中的按钮发生改变时,执行该方法,参数searchOption代表的就是当前被选中的scope
    //按钮的索引
    -(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption{
        NSMutableArray *tempArray = [NSMutableArray array];
        //获取此时在searchBar中输入的文本
        NSString *text = self.searchDisplayController.searchBar.text;
        for (Product *p in self.allProducts) {
    //判断输入的searchString是否在p的name中出现了,NSRange包含两部分,一个是location,一个是length,location记录的时在name中包含searchString的位置,length记录占用的长度,通过判断range中得length,如果长度为0 则代表name不包含search
            NSRange range = [p.name rangeOfString:text];
            if(range.length>0 && p.type==searchOption){
                [tempArray addObject:p];
            }
        }
        self.resultProducts = tempArray;
        return  YES;
    }
     
    在iOS8中,搜索框,是作为一个组成部分,聚合方式
    搜索框结构图:
     
    在MainTableViewController.m文件中
    #import "MainTableViewController.h"
    #import "Product.h"
    #import "SearchResultTableViewController.h"
    //用于显示没有搜索动作以前的全部数据的表视图控制器
    @interface MainTableViewController ()<UISearchResultsUpdating,UISearchBarDelegate>
    @property(nonatomic,strong)NSArray *allProducts;
    //用于控制所有结果显示的控制器
    @property(nonatomic,strong)UISearchController *searchController;
    //用于展示搜索结果的控制器,是自定义的用于展示结果的那个控制器
    @property(nonatomic,strong)SearchResultTableViewController *showResultViewController;
    @end
    @implementation MainTableViewController
    - (NSArray *)allProducts{
        if(!_allProducts){
            _allProducts = [Product demoData];
        }
        return _allProducts;
    }
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.showResultViewController = [[SearchResultTableViewController alloc]init];
        self.searchController = [[UISearchController alloc]initWithSearchResultsController:self.showResultViewController];
        //设置搜索控制器的结果更新时由谁代理
        self.searchController.searchResultsUpdater = self;
        //设置显示的搜索bar的大小和样式
        [self.searchController.searchBar sizeToFit];
        self.searchController.searchBar.scopeButtonTitles=@[@"设备",@"软件",@"其他"];
        //将搜索bar添加到表头视图中
        self.tableView.tableHeaderView = self.searchController.searchBar;
        //设置是否在数据发现变更时,允许切换控制器
        self.definesPresentationContext = YES;
        //为了获取scope按钮被改变这个时机,需要设置搜索框的代理
        //searchBar中包含一个文本框和一个分段控件
        self.searchController.searchBar.delegate = self;
    }
    #pragma mark - 主TableViewController的tableView内容设置,回答三问
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 1;
    }
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return self.allProducts.count;
    }
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
        Product *p = self.allProducts[indexPath.row];
        cell.textLabel.text = p.name;
        return cell;
    }
    #pragma mark - UISearchResultsUpdating
    //实现协议中的方法:更新搜索内容
    -(void)updateSearchResultsForSearchController:(UISearchController *)searchController{
        //用户输入的搜索文本
        NSString *text = searchController.searchBar.text;
        //用户选择的scope按钮
        NSInteger selectedIndex = searchController.searchBar.selectedScopeButtonIndex;
        NSMutableArray *temp = [NSMutableArray array];
        for (Product *p in self.allProducts) {
            NSRange range = [p.name rangeOfString:text];
            if(range.length>0 && p.type==selectedIndex){
                [temp addObject:p];
            }
        }
        //将搜索结果传给用于展示结果的那个控制器
        self.showResultViewController.resultArray = [temp copy];
        [self.showResultViewController.tableView reloadData];
    }
    #pragma  mark - UISearchBarDelegate
    - (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope{
        [self updateSearchResultsForSearchController:self.searchController];
    }
    @end
     
    在SearchResultTableViewController.m文件中
    #import "SearchResultTableViewController.h"
    #import "Product.h"
    @interface SearchResultTableViewController ()
    @end
    @implementation SearchResultTableViewController
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell2"];
    }
    #pragma mark - Table view data source
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 1;
    }
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return self.resultArray.count;
    }
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell2" forIndexPath:indexPath];
        Product *p = self.resultArray[indexPath.row];
        cell.textLabel.text = p.name;
        return cell;
    }
    @end
  • 相关阅读:
    ASP.NET CORE 使用Consul实现服务治理与健康检查(2)——源码篇
    ASP.NET CORE 使用Consul实现服务治理与健康检查(1)——概念篇
    Asp.Net Core 单元测试正确姿势
    如何通过 Docker 部署 Logstash 同步 Mysql 数据库数据到 ElasticSearch
    Asp.Net Core2.2 源码阅读系列——控制台日志源码解析
    使用VS Code 开发.NET CORE 程序指南
    .NetCore下ES查询驱动 PlainElastic .Net 升级官方驱动 Elasticsearch .Net
    重新认识 async/await 语法糖
    EF添加
    EF修改部分字段
  • 原文地址:https://www.cnblogs.com/lignpeng/p/5444719.html
Copyright © 2011-2022 走看看