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

 

posted @ 2015-09-20 12:07  XYQ全哥  阅读(740)  评论(0编辑  收藏  举报