• iOS UISearchController的使用


    在iOS9中,UISearchDisplayController 已经被UISearchController替代。搜索框是一种常用的控件。

    假设我们要满足下图的需求,产生100个“数字+三个随机字母”,然后搜索包含某个字母的结果。

    那么,该怎么做呢?

    #import "ViewController.h"
    
    @interface ViewController ()<UITableViewDelegate,UITableViewDataSource,UISearchControllerDelegate,UISearchResultsUpdating>
    
    //tableView
    @property (strong, nonatomic)  UITableView *tableView;
    
    //searchController
    @property (strong, nonatomic)  UISearchController *searchController;
    
    //数据源
    @property (strong,nonatomic) NSMutableArray  *dataList;
    
    @property (strong,nonatomic) NSMutableArray  *searchList;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        _dataList = [NSMutableArray array];
        _searchList = [NSMutableArray array];
        
        self.dataList=[NSMutableArray arrayWithCapacity:100];
        
        //产生100个“数字+三个随机字母”
        for (NSInteger i=0; i<100; i++) {
            [self.dataList addObject:[NSString stringWithFormat:@"%ld%@",(long)i,[self shuffledAlphabet]]];
        }
        
        _tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 20,[UIScreen  mainScreen].bounds.size.width ,[UIScreen  mainScreen].bounds.size.height)];
            
        _tableView.delegate = self;
        _tableView.dataSource = self;
        _tableView.separatorStyle = UITableViewCellSelectionStyleNone;
        
        //创建UISearchController
        _searchController = [[UISearchController alloc]initWithSearchResultsController:nil];
        //设置代理
        _searchController.delegate = self;
        _searchController.searchResultsUpdater= self;
        
        //设置UISearchController的显示属性,以下3个属性默认为YES
        //搜索时,背景变暗色
        _searchController.dimsBackgroundDuringPresentation = NO;
        //搜索时,背景变模糊
        _searchController.obscuresBackgroundDuringPresentation = NO;
        //隐藏导航栏
        _searchController.hidesNavigationBarDuringPresentation = NO;
        
        _searchController.searchBar.frame = CGRectMake(self.searchController.searchBar.frame.origin.x, self.searchController.searchBar.frame.origin.y, self.searchController.searchBar.frame.size.width, 44.0);
        
        // 添加 searchbar 到 headerview
        self.tableView.tableHeaderView = _searchController.searchBar;
        
        [self.view addSubview:_tableView];
        
        
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    
    //产生3个随机字母
    - (NSString *)shuffledAlphabet {
        
        NSMutableArray * shuffledAlphabet = [NSMutableArray arrayWithArray:@[@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"K",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",@"T",@"U",@"V",@"W",@"X",@"Y",@"Z"]];
        
        NSString *strTest = [[NSString alloc]init];
        for (int i=0; i<3; i++) {
            int x = arc4random() % 25;
            strTest = [NSString stringWithFormat:@"%@%@",strTest,shuffledAlphabet[x]];
        }
        
        return strTest;
        
    }
    
    
    //设置区域的行数
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
        if (self.searchController.active) {
            return [self.searchList count];
        }else{
            return [self.dataList count];
        }
    }
    
    
    //返回单元格内容
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        static NSString *flag=@"cell";
        UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:flag];
        if (cell==nil) {
            cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:flag];
        }
        if (self.searchController.active) {
            [cell.textLabel setText:self.searchList[indexPath.row]];
        }
        else{
            [cell.textLabel setText:self.dataList[indexPath.row]];
        }
        return cell;
    }
    
    
    #pragma mark - UISearchControllerDelegate代理
    
    //测试UISearchController的执行过程
    
    - (void)willPresentSearchController:(UISearchController *)searchController
    {
        NSLog(@"willPresentSearchController");
    }
    
    - (void)didPresentSearchController:(UISearchController *)searchController
    {
        NSLog(@"didPresentSearchController");
    }
    
    - (void)willDismissSearchController:(UISearchController *)searchController
    {
        NSLog(@"willDismissSearchController");
    }
    
    - (void)didDismissSearchController:(UISearchController *)searchController
    {
        NSLog(@"didDismissSearchController");
    }
    
    - (void)presentSearchController:(UISearchController *)searchController
    {
        NSLog(@"presentSearchController");
    }
    
    
    -(void)updateSearchResultsForSearchController:(UISearchController *)searchController {
        
        NSLog(@"updateSearchResultsForSearchController");
        NSString *searchString = [self.searchController.searchBar text];
        NSPredicate *preicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[c] %@", searchString];
        if (self.searchList!= nil) {
            [self.searchList removeAllObjects];
        }
        //过滤数据
        self.searchList= [NSMutableArray arrayWithArray:[_dataList filteredArrayUsingPredicate:preicate]];
        //刷新表格
        [self.tableView reloadData];
    }

    UISearchController代理方法的执行过程:

    UISearchController的使用步骤:

    1、创建

    //创建UISearchController
        _searchController = [[UISearchController alloc]initWithSearchResultsController:nil];

    2、设置代理

        //设置代理
        _searchController.delegate = self;
        _searchController.searchResultsUpdater= self;

    3、设置属性

        //设置UISearchController的显示属性,以下3个属性默认为YES
        //搜索时,背景变暗色
        _searchController.dimsBackgroundDuringPresentation = NO;
        //搜索时,背景变模糊
        _searchController.obscuresBackgroundDuringPresentation = NO;
        //隐藏导航栏
        _searchController.hidesNavigationBarDuringPresentation = NO;

    4、实现代理

    - (void)willPresentSearchController:(UISearchController *)searchController;
    - (void)didPresentSearchController:(UISearchController *)searchController;
    - (void)willDismissSearchController:(UISearchController *)searchController;
    - (void)didDismissSearchController:(UISearchController *)searchController;
    - (void)presentSearchController:(UISearchController *)searchController;
    
    - (void)updateSearchResultsForSearchController:(UISearchController *)searchController;

    注意点:

    1、如果你希望在同一个视图中显示搜索结果,则通过[[UISearchController alloc]initWithSearchResultsController:nil]。但是这是不支持TVOS,请提供TVOS一定要指定结果控制器。

    [[UISearchController alloc]initWithSearchResultsController:VC],可以实现指定结果控制器。

  • 相关阅读:
    【codeforces 29B】Traffic Lights
    【codeforces 131E】Yet Another Task with Queens
    Java数据结构与算法(8)
    fdisk一键操作分区-无需脚本
    【codeforces 46C】Hamsters and Tigers
    【codeforces 417D】Cunning Gena
    【codeforces 95C】Volleyball
    【codeforces 229C】Triangles
    【codeforces 234F】Fence
    【codeforces 235B】Let's Play Osu!
  • 原文地址:https://www.cnblogs.com/jukaiit/p/5063942.html
Copyright © 2020-2023  润新知