您的位置:首页 > 产品设计 > UI/UE

ios UISearchDisplayController 实现 UITableView 搜索功能

2015-12-28 17:18 796 查看
UISearchDisplayController 是苹果专为 UITableView 搜索封装的一个类。

里面内置了一个 UITableView 用于显示搜索的结果。它可以和一个需要搜索功能的

controller 关联起来,其它的像原 TableView 和搜索结果 TableView 的切换, mask 的显示等等都

封装好了,使用起来非常非常的简单。特别是要实现全屏搜索时使用最多。

全屏搜索的意思是如果你用了 NavigationBar 当点击搜索框时 TableView 会自动弹上去覆盖

NavigationBar,达到一种全屏搜索的效果,这一切 UISearchDisplayController 都封装好了,如果自己

写就比较麻烦一些。

#import "SearchListViewController.h"

@interface SearchListViewController ()<UITableViewDataSource,UITableViewDelegate,UISearchResultsUpdating,UISearchBarDelegate,UISearchDisplayDelegate>
{
NSArray *_dataList;

NSMutableArray *_showData;

UISearchBar *_searchBar;

UITableView *_searchTableView;

UISearchDisplayController *searchDisplayController;
}

@end

@implementation SearchListViewController

- (void)viewDidLoad
{
[super viewDidLoad];

[self setTopNavBackButton];

[self initContentView];
}

- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:YES];

[self performSelector:@selector(setCorrectFocus) withObject:NULL];
}

- (void)initContentView
{
_showData = [[NSMutableArray alloc]init];
_dataList = [@[@"百度",@"杭州",@"谷歌",@"苹果",@"and",@"广州",@"view",@"and",@"and",@"苹果IOS",@"谷歌android",@"微软",@"微软WP",@"table",@"bable",@"sable",@"安庆",@"西湖",@"六六",@"gable",@"fable",@"mable"]mutableCopy];

[self initSearchBar];
}

#pragma mark -- UI

- (void)initSearchBar
{
_searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 20, kDEVICEWIDTH,44)];
_searchBar.placeholder = @"搜索";
[self.view addSubview:_searchBar];

searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:_searchBar contentsController:self];
searchDisplayController.searchResultsDataSource = self;
searchDisplayController.searchResultsDelegate = self;
_searchBar.delegate = self;
}

- (void)initTableView
{
_searchTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 20, kDEVICEWIDTH, kDEVICEHEIGHT-20) style:UITableViewStylePlain];
_searchTableView.delegate = self;
_searchTableView.dataSource = self;

[self.view addSubview:_searchTableView];
}

- (void)setCorrectFocus
{
[_searchBar becomeFirstResponder];
}

/*
* 如果原 TableView 和 SearchDisplayController 中的 TableView 的 delete 指向同一个对象
* 需要在回调中区分出当前是哪个 TableView
*/
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// 谓词搜索
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self contains [cd] %@",searchDisplayController.searchBar.text];
_showData =  [[NSMutableArray alloc] initWithArray:[_dataList filteredArrayUsingPredicate:predicate]];
return _showData.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellId = @"mycell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];

if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];
}

cell.textLabel.text = _showData[indexPath.row];

return cell;
}

-(void) searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
[self searchBar:_searchBar textDidChange:nil];
[_searchBar resignFirstResponder];
}

- (void)searchBarCancelButtonClicked:(UISearchBar *) searchBar
{
[self searchBar:_searchBar textDidChange:nil];
[_searchBar resignFirstResponder];
}
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: