UISearchBar and SearchDisplayController控件:

这是一个带搜索栏和搜索显示控制器的控件,前面的SearchBar是一个搜索栏,它提供一个输入搜索条件的类似于文本框的东西,后面的SearchDisplayController是一个显示搜索结果的控制器,它自带着一个searchResultsTableView搜索结果表格视图,用来显示搜索的结果的。当然,这个表格视图要想实现功能,必须要实现<UISearchBarDelegate>和<UISearchDisplayDelegate>协议。输入搜索条件时,要用到一个新知识,即谓词NSPredicate对象的使用,它类似于数据库的搜索,也用到类似于正则表达式的功能。

用途举例:搜索当前表格中某一类型的数据。这就涉及到了两个表格视图,一个TableView和另一个searchResultsTableView,因此,需要一个区分标识,以用来决定需要显示那一个表格视图的内容。

提示:该控件在iOS8中已经过时,被UISearchController取代。

尽管如此,我还是用UISearchBar and SearchDisplayController控件举一个例子如下:

1、没有搜索时:                 2.点击搜索栏时:

  

3.显示搜索结果:                 4.取消搜索时:

  

所有文件和storyboard布局截图如下:

具体代码如下:

1.创建联系人类并初始化对象

Contact.h

 #import <Foundation/Foundation.h>

 @interface Contact : NSObject
@property (copy,nonatomic)NSString *name;
@property (copy,nonatomic)NSString *telphone;
-(instancetype)initWithName:(NSString*)name andTelphone:(NSString*)telphone;
@end

Contact.m

 #import "Contact.h"

 @implementation Contact
-(instancetype)initWithName:(NSString*)name andTelphone:(NSString*)telphone
{
self = [super init];
if(self)
{
_name = [name copy];
_telphone = [telphone copy];
}
return self;
}
@end

2.在视图控制器类中实现显示表格和搜索显示功能

ViewController.h

 #import <UIKit/UIKit.h>

 @class Contact;
@interface ViewController : UIViewController
@property (strong,nonatomic)Contact *contact;
@property (strong, nonatomic) IBOutlet UISearchDisplayController *searchVC;//搜索栏控制器
@property (strong,nonatomic)NSArray *searchedResults;//搜索栏表格数据数组
@property (strong,nonatomic)NSMutableArray *contacts;//当前控制器表格数据数组
@end

ViewController.m

 #import "ViewController.h"
#import "Contact.h" @interface ViewController ()<UITableViewDataSource,UITableViewDelegate,UISearchBarDelegate,UISearchDisplayDelegate>
@property (weak, nonatomic) IBOutlet UITableView *tableView;//表格视图
@property (weak, nonatomic) IBOutlet UISearchBar *searchBar;//搜索栏
@property (assign,nonatomic)BOOL isSearched;//判断是搜索栏的表格视图,还是视图控制器的,刷新数据
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; //初始化
self.contacts = [NSMutableArray arrayWithCapacity:]; //创建是个联系人
for(int i=; i<; i++)
{
self.contact = [[Contact alloc]initWithName:[NSString stringWithFormat:@"contact%02d",i] andTelphone:[NSString stringWithFormat:@"1873456%04d",arc4random_uniform()]]; [self.contacts addObject:self.contact];
} //设置tableView数据源和代理
self.tableView.dataSource = self;
self.tableView.delegate = self; //设置UISearchBar代理
self.searchBar.delegate = self; //初始化为NO
self.isSearched = NO;
}
//视图显示时,刷新数据
-(void)viewWillAppear:(BOOL)animated
{
if(self.isSearched)
{
[self.searchVC.searchResultsTableView reloadData];//搜索栏控制器的表格视图刷新数据
}
else
{
[self.tableView reloadData];//当前视图控制器的表格视图刷新数据
}
}
#pragma mark -<UITableViewDataSource>
//行数
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if(tableView == self.tableView)
{
self.isSearched = NO;
return self.contacts.count;
}
else
{
self.isSearched = YES;
return self.searchedResults.count;
}
}
//设置每一个单元格的内容
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//1.根据reuseIdentifier,先到对象池中去找重用的单元格对象
static NSString *reuseIdentifier = @"Cell";
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
//2.如果没有找到,自己创建单元格对象
if(cell == nil)
{
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier];
}
//3.设置单元格对象的内容
if(tableView == self.tableView)
{
self.contact = self.contacts[indexPath.row];
cell.textLabel.text = self.contact.name;
cell.detailTextLabel.text = self.contact.telphone;
}
else
{
self.contact = self.searchedResults[indexPath.row];
cell.textLabel.text = self.contact.name;
cell.detailTextLabel.text = self.contact.telphone;
}
return cell;
}
#pragma mark -<UITableViewDElegate>
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return ;
} #pragma mark -<UISearchBarDelegate>
-(BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
{
//隐藏导航栏
[self.navigationController setNavigationBarHidden:YES];
return YES;
}
-(BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar
{
//显示导航栏
[self.navigationController setNavigationBarHidden:NO];
return YES;
}
-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
{
//刷新表格
[self.tableView reloadData];
}
#pragma mark -<UISearchDisplayDelegate>
//使用搜索字符串过滤原始数据,找出符合条件的联系人
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
//谓词的格式化
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd]%@",searchString]; //过滤原始数据
self.searchedResults = [self.contacts filteredArrayUsingPredicate:predicate]; return YES;
}
@end

iOS:搜索栏控件UISearchBar and SearchDisplayController的使用的更多相关文章

  1. JS调用Android、Ios原生控件

    在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...

  2. 初识IOS,Label控件的应用。

    初识IOS,Label控件的应用. // // ViewController.m // Gua.test // // Created by 郭美男 on 16/5/31. // Copyright © ...

  3. IOS—UITextFiled控件详解

    IOS—UITextFiled控件详解 //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGR ...

  4. [iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表"练习)

    A.概述      在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能      1.按钮点击后,显示为“已下载”,并且不 ...

  5. android 仿ios开关控件

    ios一些控件还是挺美丽的,可是对android程序猿来说可能比較苦逼,由于ios一些看起来简单的效果对android来说可能就没那么简单了,可是没办法非常多产品都是拿ios的一些控件叫android ...

  6. 79.iOS 设备的UI规范和iOS各控件默认高度

    iOS设备的UI 规范 iPhone界面尺寸 iPhone图标尺寸 iPad的设计尺寸 iPad图标尺寸 iPhone设备尺寸分辨率比例 iPhone各设备 launch image iOS 各种控件 ...

  7. [iOS基础控件 - 7.0] UIWebView

    A.基本使用 1.概念 iOS内置的浏览器控件 Safari浏览器就是通过UIWebView实现的   2.用途:制作简易浏览器 (1)基本请求 创建请求 加载请求 (2)代理监听webView加载, ...

  8. ios UI控件的简单整理

    把该文件拷贝到.m文件中就能够方便的查找 /** 匿名类目:能够声明方法和变量,属性为private(不同意在外部调用,且不能被继承 */ /** 发送数据的托付方,接收数据的时代理发(即代理的反向传 ...

  9. Xamarin Studio在Mac环境下的配置和Xamarin.iOS常用控件的示例

    看过好多帖子都是Win环境装XS,Mac只是个模拟器,讲解在Mac环境下如何配置Xamarin Studio很少,也是一点点找资料,东拼西凑才把Xamarin Studio装在Mac上跑起来,如下: ...

随机推荐

  1. mysql左连接,右连接,内连接

  2. keil中的memory model

    这两天仿真遇到的怪事真的是一大堆. 还是读写Flash的代码.keil编译OK,但是仿真就是莫名其妙地挂掉出现一些乱七八糟的事情. 后面发现是keil 中的memory model勾选错了,勾选的是l ...

  3. Docker应用系列(四)| 部署java应用

    本示例基于Centos 7,假设目前使用的账号为release,拥有sudo权限. 由于Docker官方镜像下载较慢,可以开启阿里云的Docker镜像下载加速器,可参考此文进行配置. 主机上服务安装步 ...

  4. thunk 函数

    function* f() { console.log(1); for (var i = 0; true; i++) { console.log('come in'); var reset = yie ...

  5. CODEVS1358【DFS/状压DP】

    题目链接[http://codevs.cn/problem/1358/] 题意:这个游戏在一个有10*10个格子的棋盘上进行,初始时棋子位于左上角,终点为右下角,棋盘上每个格子内有一个0到9的数字,每 ...

  6. HDU1251 统计难题 trie树 简单

    http://acm.hdu.edu.cn/showproblem.php?pid=1251 题意: 找前缀数量 裸模板 #include<cstdio> #include<cstr ...

  7. lucas定理 FOJ 2020 组合

     Problem 2020 组合 Accept: 886    Submit: 2084Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem ...

  8. JavaScript设计模式与开发实践——读书笔记1.高阶函数(上)

    说来惭愧,4个多月未更新了.4月份以后就开始忙起来了,论文.毕设.毕业旅行等七七八八的事情占据了很多时间,毕业之后开始忙碌的工作,这期间一直想写博客,但是一直没能静下心写.这段时间在看<Java ...

  9. MySQL数据库单例连接简单实现(MySQL扩展)

    <?php /** * MySQL数据库单例实现 * * @author shizq at 2015-04-22 * */ final class MySQLFactory { private ...

  10. poj 2828 buy Tickets 用线段树模拟带插入的队列

    Buy Tickets Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2 ...