zoukankan      html  css  js  c++  java
  • 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;
    }
    
    
    
  • 相关阅读:
    备份的数据库存儲過程
    用反射调用任意.net库中的方法
    基于.NET的多线程编程入门
    手写分页函数C#
    .net中的泛型
    prototype.js开发笔记
    此方法用于确认用户输入的不是恶意信息
    利用DataSet、DataTable、DataView按照自定义条件过滤数据
    读取文件列表
    注册客户端脚本
  • 原文地址:https://www.cnblogs.com/tangaofeng/p/4873065.html
Copyright © 2011-2022 走看看