• 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

  • 相关阅读:
    iframe页面向上获取父级元素
    解决flex布局 做后一行 靠左的问题
    JavaScript Base64 作为文件上传的实例代码解析
    Python中Flask框架SQLALCHEMY_ECHO设置
    #跟着教程学# 5、python的异常
    #跟着教程学# 4、Python流程控制
    #跟着教程学# 3、Python基础 //Maya select和ls命令返回值问题
    #跟着教程学# 2、Maya Developer Kit下载,及 PyCharm关联Maya
    #跟着教程学# 1、Python_文件批量改名
    (转)maya螺旋线脚本(mel)
  • 原文地址:https://www.cnblogs.com/lesliefang/p/3929677.html
Copyright © 2020-2023  润新知