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. Qt 下载列表地址

    每次下载Qt总是找好长时间,收藏一下地址 Qt 下载列表地址 https://www.qt.io/download-open-source/#section-9 教育网镜像下载 http://mirr ...

  2. python中调用cmd

    1. 使用os.system("cmd") 这是最简单的一种方法,特点是执行的时候程序会打出cmd在linux上执行的信息.使用前需要import os. os.system(&q ...

  3. 深度扫盲JavaScript的模块化(AMD , CMD , CommonJs 和 ES6)

    原文地址 https://blog.csdn.net/haochangdi123/article/details/80408874 一.commonJS 1.内存情况 对于基本数据类型,属于复制.即会 ...

  4. VS 关于 .sln 文件和 .suo 文件

    VS 关于 .sln 文件和 .suo 文件  Visual Studio.NET采用两种文件类型(.sln和.suo)来存储特定于解决方案的设置,它们总称为解决方案文件.为解决方案资源管理器提供显示 ...

  5. Django Suit v2-dev 使用

    转:链接:https://www.jianshu.com/p/84fa8219fb48 官方文档: 链接 Git: 链接 install Django Suit 为了适配 Django 有许多不同的版 ...

  6. JS 汉字与Unicode码的相互转化

    js文件中,有些变量的值可能会含有汉字,画面引入js以后,有可能会因为字符集的原因,把里面的汉字都变成乱码.后来发现网上的一些js里会把变量中的汉字都表示成”\u“开头的16进制编码,这样应该可以解决 ...

  7. 实验吧--隐写术--九连环--WriteUp

    题目: http://ctf5.shiyanbar.com/stega/huan/123456cry.jpg 是一张图: 放到binwalk查看一下 发现存在压缩文件. 使用-e参数将文件分离 打开文 ...

  8. 阿里云下Linux服务器安装JDK、Tomcat

    阿里云服务器相信大家越来越熟悉,刚开始接触,将基本的java软件安装做点记录: 1.配置阿里云的yum仓库: 获取仓库配置 wget http://mirrors.aliyun.com/repo/Ce ...

  9. 【BZOJ】1042: [HAOI2008]硬币购物

    1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3307  Solved: 2075[Submit][Stat ...

  10. Java容器-引用数据类型排序+TreeSet、TreeMap底层实现

    目录 1.冒泡排序的实现 2.比较接口(普通数据类型.引用数据类型) 普通数据类型:冒泡排序 引用数据类型:包装类(Integer.String.Character.Date) 自定义类型:实体类:i ...