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
  • 相关阅读:
    离散数学随笔2
    离散数学随笔1
    java多线程实现线程同步
    c语言细节
    堆的简单实现和应用
    快速排序分析
    ORACLE PRAGMA AUTONOMOUS_TRANSACTION 自治事务 单独提交某一段操作
    System.out.println() 输出 快捷键
    最全最新🇨🇳中国【省、市、区县、乡镇街道】json,csv,sql数据
    使用 js 设置组合快捷键,支持多个组合键定义,还支持 React
  • 原文地址:https://www.cnblogs.com/lignpeng/p/5444719.html
Copyright © 2011-2022 走看看