UISearchBar与UISearchDisplayController

1、一开始呢我是搞不清楚这两个东西有什么关系,或者说UISearchDisplayController我根本就没用过,那么就先来看下UISearchBar的使用效果

2、UISearchBar是个搜索工具条,这个控件的工作原理非常简单,他与UITextField其实有点像,能够监听开始搜索,搜索词变化,搜索结束等一系列状态,并调用代理的相关方法,这些功能UITextField不是也都有吗?只是他是专业的搜索控件,长得好看一点而已!

3、来,看下UISearchBar在TableView中的表现吧,两张图给你看出效果:

iOS Simulator Screen Shot 2015年6月1日 下午1.42.55iOS Simulator Screen Shot 2015年6月1日 下午1.42.59

4、如何实现呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//
//? ViewController.m
//? Test
//
//? Created by 余西安 on 15/6/1.
//? Copyright (c) 2015年 Sian. All rights reserved.
//
?
#import "ViewController.h"
?
@interface ViewController () <UISearchDisplayDelegate, UISearchBarDelegate>
?
@property (nonatomic, strong) NSMutableArray??? *dataArray;
?
@property (nonatomic, strong) NSArray?????????? *searchArray;
?
//@property (nonatomic, strong) UISearchDisplayController *searchDisplay;
?
@end
?
@implementation ViewController
?
- (void)viewDidLoad
{
????[super viewDidLoad];
????self.dataArray = [NSMutableArray arrayWithObjects:@"a", @"b", @"c", @"d", @"e", nil];
????self.searchArray = [self.dataArray mutableCopy];
????UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 0, 44)];
????searchBar.delegate = self;
????self.tableView.tableHeaderView = searchBar;
//??? self.searchDisplay = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
//??? self.searchDisplay.searchResultsDataSource = self;? // 搜索结果表格DataSource
//??? self.searchDisplay.searchResultsDelegate = self;??? // 搜索结果表格Delegate
}
?
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
????return self.dataArray.count;
}
?
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
????UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SATestCell"];
????if (cell == nil){
????????cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"SATestCell"];
????}
????cell.textLabel.text = self.dataArray[indexPath.row];
????return cell;
}
?
#pragma mark - UISearchBar代理方法
/// 搜索框内容发生变化时调用
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
????[self.dataArray removeAllObjects];
????for (NSString *string in self.searchArray) {
????????if ([string rangeOfString:searchText].length || searchText.length == 0){
????????????[self.dataArray addObject:string];
????????}
????}
????[self.tableView reloadData];??? // 如果使用UISearchDisplayController这句代码则没必要
}
/// 取消搜索时调用
- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
{
????self.dataArray = [self.searchArray mutableCopy];
????[self.tableView reloadData];
}
?
@end

5、再来看看UISearchDisplayController是个什么东西,从上图来看,普通的UISearchBar的搜索结果在原有的TableView上展示,当取消时还原原有的所有数据,回到初始状态。

6、UISearchDisplayController则在此基础上做了一点点加工,主要体现在两个方面:第一、搜索结果不在原有的表格上展示,而是在一个新的TableView上显示搜索结果;第二、将搜索页面全屏显示,让用户专注于搜索过程,更简洁美观。
注意:UISearchDisplayController不能单独工作,他需要基于某个UISearchBar!!

7、如果不很清楚,来,看下效果图:

iOS Simulator Screen Shot 2015年6月1日 下午1.43.12iOS Simulator Screen Shot 2015年6月1日 下午1.43.15

8、代码实现与上面的一致,把注释掉的部分打开即可,事实上就多了那么几行:

1
2
3
4
@property (nonatomic, strong) UISearchDisplayController *searchDisplay;
????self.searchDisplay = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
????self.searchDisplay.searchResultsDataSource = self;? // 搜索结果表格DataSource
????self.searchDisplay.searchResultsDelegate = self;??? // 搜索结果表格Delegate

9、Demo下载 UISearchBar

Leave a Reply