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

1 #import <Foundation/Foundation.h>
2
3 @interface Contact : NSObject
4 @property (copy,nonatomic)NSString *name;
5 @property (copy,nonatomic)NSString *telphone;
6 -(instancetype)initWithName:(NSString*)name andTelphone:(NSString*)telphone;
7 @end

Contact.m

 1 #import "Contact.h"
 2
 3 @implementation Contact
 4 -(instancetype)initWithName:(NSString*)name andTelphone:(NSString*)telphone
 5 {
 6     self = [super init];
 7     if(self)
 8     {
 9         _name = [name copy];
10         _telphone = [telphone copy];
11     }
12     return self;
13 }
14 @end

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

ViewController.h

1 #import <UIKit/UIKit.h>
2
3 @class Contact;
4 @interface ViewController : UIViewController
5 @property (strong,nonatomic)Contact *contact;
6 @property (strong, nonatomic) IBOutlet UISearchDisplayController *searchVC;//搜索栏控制器
7 @property (strong,nonatomic)NSArray *searchedResults;//搜索栏表格数据数组
8 @property (strong,nonatomic)NSMutableArray *contacts;//当前控制器表格数据数组
9 @end

ViewController.m

  1 #import "ViewController.h"
  2 #import "Contact.h"
  3
  4 @interface ViewController ()<UITableViewDataSource,UITableViewDelegate,UISearchBarDelegate,UISearchDisplayDelegate>
  5 @property (weak, nonatomic) IBOutlet UITableView *tableView;//表格视图
  6 @property (weak, nonatomic) IBOutlet UISearchBar *searchBar;//搜索栏
  7 @property (assign,nonatomic)BOOL isSearched;//判断是搜索栏的表格视图,还是视图控制器的,刷新数据
  8 @end
  9
 10 @implementation ViewController
 11
 12 - (void)viewDidLoad {
 13     [super viewDidLoad];
 14
 15     //初始化
 16     self.contacts = [NSMutableArray arrayWithCapacity:10];
 17
 18     //创建是个联系人
 19     for(int i=0; i<10; i++)
 20     {
 21         self.contact = [[Contact alloc]initWithName:[NSString stringWithFormat:@"contact%02d",i] andTelphone:[NSString stringWithFormat:@"1873456%04d",arc4random_uniform(10000)]];
 22
 23         [self.contacts addObject:self.contact];
 24     }
 25
 26     //设置tableView数据源和代理
 27     self.tableView.dataSource = self;
 28     self.tableView.delegate  = self;
 29
 30     //设置UISearchBar代理
 31     self.searchBar.delegate  = self;
 32
 33     //初始化为NO
 34     self.isSearched = NO;
 35 }
 36 //视图显示时,刷新数据
 37 -(void)viewWillAppear:(BOOL)animated
 38 {
 39     if(self.isSearched)
 40     {
 41         [self.searchVC.searchResultsTableView reloadData];//搜索栏控制器的表格视图刷新数据
 42     }
 43     else
 44     {
 45         [self.tableView reloadData];//当前视图控制器的表格视图刷新数据
 46     }
 47 }
 48 #pragma mark -<UITableViewDataSource>
 49 //行数
 50 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 51 {
 52     if(tableView == self.tableView)
 53     {
 54         self.isSearched = NO;
 55         return self.contacts.count;
 56     }
 57     else
 58     {
 59         self.isSearched = YES;
 60         return self.searchedResults.count;
 61     }
 62 }
 63 //设置每一个单元格的内容
 64 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 65 {
 66     //1.根据reuseIdentifier,先到对象池中去找重用的单元格对象
 67     static NSString *reuseIdentifier = @"Cell";
 68     UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
 69     //2.如果没有找到,自己创建单元格对象
 70     if(cell == nil)
 71     {
 72         cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier];
 73     }
 74     //3.设置单元格对象的内容
 75     if(tableView == self.tableView)
 76     {
 77         self.contact = self.contacts[indexPath.row];
 78         cell.textLabel.text = self.contact.name;
 79         cell.detailTextLabel.text = self.contact.telphone;
 80     }
 81     else
 82     {
 83         self.contact = self.searchedResults[indexPath.row];
 84         cell.textLabel.text = self.contact.name;
 85         cell.detailTextLabel.text = self.contact.telphone;
 86     }
 87     return cell;
 88 }
 89 #pragma mark -<UITableViewDElegate>
 90 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
 91 {
 92     return 55;
 93 }
 94
 95 #pragma mark -<UISearchBarDelegate>
 96 -(BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
 97 {
 98     //隐藏导航栏
 99     [self.navigationController setNavigationBarHidden:YES];
100     return YES;
101 }
102 -(BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar
103 {
104     //显示导航栏
105     [self.navigationController setNavigationBarHidden:NO];
106     return YES;
107 }
108 -(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
109 {
110     //刷新表格
111     [self.tableView reloadData];
112 }
113 #pragma mark -<UISearchDisplayDelegate>
114 //使用搜索字符串过滤原始数据,找出符合条件的联系人
115 -(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
116 {
117     //谓词的格式化
118     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd]%@",searchString];
119
120     //过滤原始数据
121     self.searchedResults = [self.contacts filteredArrayUsingPredicate:predicate];
122
123     return YES;
124 }
125 @end
时间: 2024-11-05 18:43:05

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

iOS常用控件尺寸大集合

元素控件 尺寸(pts) Window(含状态栏) 320 x 480 Status Bar的高度 20 Navigation Bar的高度 44 含Prompt的Navigation Bar的高度 74 Navigation Bar的图标 20×20(透明的png) Tool Bar的高度 44 Tool Bar的图标 20×20(透明的png) Tab Bar的高度 49 Tab Bar的图标 30×30(透明的png) 竖直时键盘的高度 216.252(iOS 5+的中文键盘) 水平时键盘

iOS第三方控件

一.SIAlertView https://github.com/Sumi-Interactive/SIAlertView 感言: 扁平化设计的对话框(UIAlertView),对话框的弹出与消失的动画很不错,可以自定义对话框的外观 iOS第三方控件

iOS UITextField控件总结

iOS UITextField控件总结 先声明下面总结不是自己写的. //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)]; //设置边框样式,只有设置了才会显示边框样式 text.borderStyle = UITextBorderStyleRoundedRect; typedef enum { UITextBorderStyleNone

iOS基础控件UINavigationController中的传值

iOS基础控件UINavigationController中的传值,代理传值,正向传值,反向传值 #import <UIKit/UIKit.h> //声明一个协议 @protocol SendValue<NSObject> //定义一个方法 - (void)sendBtnTitle:(NSString *)title; @end @interface FirstViewController : UIViewController // 定义代理 @property (nonatomi

IOS Ui控件 修改位置和尺寸,代码添加控件

所有的UI控件最终都继承自UIView,UI控件的公共属性都定义在UIView中, UIView的常见属性 UIView *superview; 获得自己的父控件对象 NSArray *subviews; 获得自己的所有子控件对象 NSInteger tag; 控件的ID(标识),父控件可以通过tag来找到对应的子控件 CGAffineTransform transform; 控件的形变属性(可以设置旋转角度.比例缩放.平移等属性) CGRect frame; 控件所在矩形框在父控件中的位置和尺

IOS—UITextFiled控件详解

IOS—UITextFiled控件详解 //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)]; //设置边框样式,只有设置了才会显示边框样式 text.borderStyle = UITextBorderStyleRoundedRect; typedef enum { UITextBorderStyleNone, UITextBorderS

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

A.概述 在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能 1.按钮点击后,显示为“已下载”,并且不可以再按 2.在屏幕中间弹出一个消息框,通知消息“xx已经被安装”,慢慢消失 3.消息框样式为圆角半透明 B.不使用代理模式,使用app空间组和主View之间的父子View关系 1.在主View中创建一个消息框 主View控制器:ViewController.m 1 // 创建下载成功消息框 2 CGFloat labelWid

JS调用Android、Ios原生控件

在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时,提高代码质量,实现两者在网页端代码的统一. 首先我们先看一下Ios调用JS的方法实现: //无参调用 function SwiftCallJs1(){} //有参调用 function SwiftCallJs2(name, message){} 紧接着我们看一下Android调用JS的方法实现: /

android 仿ios开关控件

ios一些控件还是挺漂亮的,但是对android程序员来说可能比较苦逼,因为ios一些看起来简单的效果对android来说可能就没那么简单了,但是没办法很多产品都是拿ios的一些控件叫android开发人员来照着做,今天就来做一个设置中常见的开关效果, 思路: 1:准备二张图片 一个是包含开和关二种状态的图片,一个是上面滑动的按钮图片 2:这些图片肯定是不能通过原生态的控件显示上去的,要通过canvas画上去 3:要解决点击和滑动的事件冲突,因为点击包含 按下 离开,而滑动包含按下  移动 离开