ios UISearchDisplayController 实现 UITableView 搜索功能

来源:互联网 发布:淘宝网冻结 编辑:程序博客网 时间:2024/05/22 04:25

http://www.cnblogs.com/lesliefang/p/3929677.html

UISearchDisplayController 是苹果专为 UITableView 搜索封装的一个类。

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

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

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

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

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

写就比较麻烦一些。

关键代码:

@interface MainViewController : UITableViewController{    NSArray *data;    NSArray *filterData;    UISearchDisplayController *searchDisplayController;}
复制代码
- (void)viewDidLoad{    [super viewDidLoad];    UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width                                                                           , 44)];    searchBar.placeholder = @"搜索";        // 添加 searchbar 到 headerview    self.tableView.tableHeaderView = searchBar;        // 用 searchbar 初始化 SearchDisplayController    // 并把 searchDisplayController 和当前 controller 关联起来    searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];        // searchResultsDataSource 就是 UITableViewDataSource    searchDisplayController.searchResultsDataSource = self;    // searchResultsDelegate 就是 UITableViewDelegate    searchDisplayController.searchResultsDelegate = self;}
复制代码
复制代码
/* * 如果原 TableView 和 SearchDisplayController 中的 TableView 的 delete 指向同一个对象 * 需要在回调中区分出当前是哪个 TableView */- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{    if (tableView == self.tableView) {        return data.count;    }else{        // 谓词搜索        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self contains [cd] %@",searchDisplayController.searchBar.text];        filterData =  [[NSArray alloc] initWithArray:[data filteredArrayUsingPredicate:predicate]];        return filterData.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];    }        if (tableView == self.tableView) {        cell.textLabel.text = data[indexPath.row];    }else{        cell.textLabel.text = filterData[indexPath.row];    }        return cell;}
复制代码

DEMO 下载:http://pan.baidu.com/s/1pJ8vvC3

0 0
原创粉丝点击