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. 【LOJ】#2016. 「SCOI2016」美味

    题解 做了一下SCOI2015,于是决定搬运SCOI2016= v = 如果没有加法,我们可以向左向右节点查找 每个总权值是2^18 - 1,然后左右分,那么每次是一个完整的节点 如果有了加法,那么我 ...

  2. 4款Github泄漏敏感信息搜索工具简单比较

    gitrob Ruby开发,支持通过postgresql数据库https://github.com/michenriksen/gitrob weakfilescan Python开发,多线程,猪猪侠开 ...

  3. 【WPF】淡入淡出切换页面

    <NavigationWindow x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsof ...

  4. 手机锁屏js倒计时停止问题解决办法探索

    如图,有这么个需求,测试人员在测试过程中提了一个bug,手机锁屏再唤醒倒计时时间没有更新,仍从锁屏的时间继续,于是开始寻找解决之法 经了解得知,锁屏时候,浏览器的一切活动会停止运行,那么js也无法幸免 ...

  5. React Native踩坑之启动android模拟器失败

    报错 Could not install the app on the device, read the error above for details.Make sure you have an A ...

  6. Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)

    题面 Bzoj 洛谷 题解 显然,如果让你查询整个数列的最大异或和,建一颗\(01Trie\),每给定一个\(p\),按照二进制后反方向跳就行了(比如当前二进制位为\(1\),则往\(0\)跳,反之亦 ...

  7. FutureTask简单实战

    FutureTask是什么? 线程池的实现核心之一是FutureTask.在提交任务时,用户实现的Callable实例task会被包装为FutureTask实例ftask:提交后任务异步执行,无需用户 ...

  8. 2017广东工业大学程序设计竞赛决赛--Problem B: 占点游戏

    Description 众所周知的是,TMK特别容易迟到,终于在TMK某次又迟到了之后,Maple怒了,Maple大喊一声:"我要跟你决一死战!"然后Maple就跟TMK玩起了一个 ...

  9. 表白 代码 韩梦飞沙-画心.html

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 韩梦飞沙-画心.html <!DOCTYPE html> <html& ...

  10. hdu 1711

    读入优化有3s多. #include <cstdio> #include <cctype> #define maxn 1000010 #define maxm 10010 in ...