• ios UISearchDisplayController 实现 UITableView 搜索功能


    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

  • 相关阅读:
    从路径中拆分出文件名和后缀
    屏幕中判断必输
    根据tcode查找增强的程序
    IDOC练习(二、接收端配置)
    ORACLE 绑定变量用法总结
    Oracle数据类型之number
    总结:整理 oracle异常错误处理
    ISNUMBER函数的创建以及函数创建思路。
    oracle 绑定变量 bind variable(2)
    oracle 绑定变量(bind variable)(1)
  • 原文地址:https://www.cnblogs.com/lesliefang/p/3929677.html
Copyright © 2020-2023  润新知