iOS:搜索栏控件UISearchBar and SearchDisplayController的使用
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的使用的更多相关文章
- JS调用Android、Ios原生控件
在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...
- 初识IOS,Label控件的应用。
初识IOS,Label控件的应用. // // ViewController.m // Gua.test // // Created by 郭美男 on 16/5/31. // Copyright © ...
- IOS—UITextFiled控件详解
IOS—UITextFiled控件详解 //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGR ...
- [iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表"练习)
A.概述 在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能 1.按钮点击后,显示为“已下载”,并且不 ...
- android 仿ios开关控件
ios一些控件还是挺美丽的,可是对android程序猿来说可能比較苦逼,由于ios一些看起来简单的效果对android来说可能就没那么简单了,可是没办法非常多产品都是拿ios的一些控件叫android ...
- 79.iOS 设备的UI规范和iOS各控件默认高度
iOS设备的UI 规范 iPhone界面尺寸 iPhone图标尺寸 iPad的设计尺寸 iPad图标尺寸 iPhone设备尺寸分辨率比例 iPhone各设备 launch image iOS 各种控件 ...
- [iOS基础控件 - 7.0] UIWebView
A.基本使用 1.概念 iOS内置的浏览器控件 Safari浏览器就是通过UIWebView实现的 2.用途:制作简易浏览器 (1)基本请求 创建请求 加载请求 (2)代理监听webView加载, ...
- ios UI控件的简单整理
把该文件拷贝到.m文件中就能够方便的查找 /** 匿名类目:能够声明方法和变量,属性为private(不同意在外部调用,且不能被继承 */ /** 发送数据的托付方,接收数据的时代理发(即代理的反向传 ...
- Xamarin Studio在Mac环境下的配置和Xamarin.iOS常用控件的示例
看过好多帖子都是Win环境装XS,Mac只是个模拟器,讲解在Mac环境下如何配置Xamarin Studio很少,也是一点点找资料,东拼西凑才把Xamarin Studio装在Mac上跑起来,如下: ...
随机推荐
- 【DEV C++】 Error: ld returned 1 exit status
一般出现“ld returned 1 exit status”错误都是由于函数名称拼写错误造成的,或者在一个工程中不同的函数使用了同一个函数名,暂时还未遇到其他情况.
- day6 os模块
OS模块 提供对操作系统进行调用的接口 (1)os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 >>> os.getcwd() 获取 ...
- 第 17 章 使用API
在本章中,我们将学习如何编写一个独立的程序,并对其获取的数据进行可视化.这个程序将使用Web应用编程接口(API)自动请求网站的特定信息而不是整个网页,再对这些信息进行可视化.由于这样编写的程序始终使 ...
- 常用的scrapy setting
原文请参考 Scrapy 爬虫入门教程十三 Settings(设置), 讲的很详细 官网参考 Settings 设置 Scrapy 设置允许您自定义所有 Scrapy 组件的行为,包括核心,扩 ...
- 【LOJ】 #2011. 「SCOI2015」情报传递
题解 一写过一交A的一道数据结构水题 我们发现大于C可以转化为这条路径上有多少个在某天之前开始调查的情报员,离线全部读入,变成树上路径查询某个区间的数出现过多少次,构建一棵根缀的主席树,查询的时候用两 ...
- gcc编译器参数
[gcc编译步骤] 1.预处理,生成.i的文件[预处理器cpp] 2.将预处理后的文件转换成汇编语言,生成文件.s[编译器egcs] 3.由汇编变为目标代码(机器代码)生成.o的文件[汇编器as] 4 ...
- KVM调整cpu和内存
一.修改kvm虚拟机的配置 1.virsh edit centos7 找到“memory”和“vcpu”标签,将 <name>centos7</name> <uuid&g ...
- BOM知识整理
1.窗口位置: 1-1.window,screenLeft获取窗口距离屏幕左边的距离 1-2.window.screenTop获取窗口距离屏幕顶端的距离 1-3.window.screenX和wind ...
- thinkphp5.0独立配置
独立配置文件 新版支持配置文件分离,只需要配置extra_config_list参数(在应用公共配置文件中). 例如,不使用独立配置文件的话,数据库配置信息应该是在config.php中配置如下: / ...
- HDU 6031 Innumerable Ancestors
树状数组,倍增,枚举,$dfs$序. 对于每一次的询问,可以枚举$B$集合中的所有点,对于每一个点,在树上二分$LCA$,找到最低的更新答案. 判断是否是$LCA$可以搞个$dfs$序,将$A$集合中 ...