在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

iOS搜索框的更多相关文章

  1. iOS --- 搜索框UISearchController的使用(iOS8.0以后替代UISearchBar+display)

    在iOS 8.0以上版本中, 我们可以使用UISearchController来非常方便地在UITableView中添加搜索框. 而在之前版本中, 我们还是必须使用UISearchBar + UISe ...

  2. iOS 搜索框控件 最简单的dome

    刚学习搜索框控件,写了个最简单的dome #import <UIKit/UIKit.h> .h @interface ViewController : UIViewController&l ...

  3. iOS搜索框UISearchBar

    当你在seachBar中输入字母之前的时候,只是用鼠标选中searchBar的时候,如图 终端输出截图如下:(这个时候调用先shouldBeginEditing,之后调用didBeginEditing ...

  4. iOS搜索框UISearchBar 分类: ios技术 2015-04-03 08:55 82人阅读 评论(0) 收藏

    当你在seachBar中输入字母之前的时候,只是用鼠标选中searchBar的时候,如图 终端输出截图如下:(这个时候调用先shouldBeginEditing,之后调用didBeginEditing ...

  5. IOS搜索框输入中文解决方案(防抖)

    class Header extends React.Component { constructor(props) { super(props); this.time = 0; // 重点在于这个th ...

  6. iOS之搜索框UISearchController的使用(iOS8.0以后替代UISearchBar+display)

    在iOS 8.0以上版本中, 我们可以使用UISearchController来非常方便地在UITableView中添加搜索框. 而在之前版本中, 我们还是必须使用UISearchBar + UISe ...

  7. iOS开发——UI篇OC篇&TextField作为搜索框的使用

    TextField作为搜索框的使用 在iOS开发中我们经常会使用到搜索框,但是有的时候系统自带的搜索框不足以满足我吗想要的功能,这个时候我们就可以使用自定义的搜索框实现想要的功能. 今天就简单的介绍一 ...

  8. 【好程序员笔记分享】——iOS开发之使用TextField作为搜索框

    -iOS培训,iOS学习-------型技术博客.期待与您交流!------------ iOS开发之使用TextField作为搜索框     今天给大家带来一个新的技巧,比如平时我们要使用代码创建一 ...

  9. ios UISearchBar搜索框的基本使用

    摘要: 小巧简洁的原生搜索框,漂亮而易用,如果我们的应用没有特殊需求,都可以使用它. iOS中UISearchBar(搜索框)使用总结 初始化:UISearchBar继承于UIView,我们可以像创建 ...

随机推荐

  1. HDFS分布式文件系统设计思想

    HDFS设计目标 1)硬件错误是常态,数据保存需要冗余. 2)数据批量读取,Hadoop擅长数据分析而不是事务处理. 3)大规模数据集. 4)简单一致醒模型,降低系统复杂度,文件一次写入多次读取, 5 ...

  2. Hadoop上路-03_Hadoop JavaAPI

    一.Eclipse安装 1.下载解压 下载:http://www.eclipse.org/downloads/ 解压:SHELL$ sudo tar -zxvf eclipse.tar.gz 2.快捷 ...

  3. 视频资源下载方法[download video resources]

    笔者做视频时钟分析,需要用到大量特殊的视频,如何获取需要的视频是一个问题? 以下载NBA视频为例: Tools:①腾讯视频软件 (自行下载)  ②批处理文件(下文会给出代码) convert.bat ...

  4. LUA和C++绑定的一些天然的麻烦

    最近在看Luatinker的源代码,打算自己改(仿写)写搞一个简单的封装C++和LUA的结合的库,结果发现其实麻烦和困惑比想象的多. 比如这些点: 1)有时候使用模板的时候,引用会退化. classt ...

  5. Git Book 中文版 - Git的撤消操作 - 重置, 签出 和 撤消

    Git Book 中文版 - Git的撤消操作 - 重置, 签出 和 撤消 Git的撤消操作 - 重置, 签出 和 撤消 Git提供了多种修复你开发过程中的错误的方法. 方法的选择取决于你的情况: 包 ...

  6. 给 TTreeView 添加复选框

    //1.引用单元 uses Commctrl ; //2.定义私有过程 procedure tvToggleCheckbox(TreeView: TTreeView;Node: TTreeNode;i ...

  7. sping配置文件中引入properties文件方式

    <!-- 用于引入 jdbc有配置文件参数 可以使用PropertyPlaceholderConfigurer 或者PropertyOverrideConfigurer --> <b ...

  8. 转载Repository 和Unit of work的使用说明

    利用Repository and Unit of Work重构项目 文章索引和简介 项目最基础的东西已经结束了,但是现在我们的项目还不健全  不利于测试 重复性代码多   层与层之间耦合性高  不利于 ...

  9. Web开源框架大汇总

    Struts 项目简介信息 Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的.由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,在过去的 ...

  10. MongoDB 快速入门--中级

    索引 ensureIndex 用来创建索引,需要注意的就是一个集合最多也就64个索引 如果没加所有就是表扫表,速度很慢, 当然如果索引的键有多个,就必须考虑顺序 拓展索引 同样的也可以为内嵌文档 建立 ...