zoukankan      html  css  js  c++  java
  • iOS:搜索栏控件UISearchBar and SearchDisplayController的使用

    UISearchBar and SearchDisplayController控件:

    这是一个带搜索栏和搜索显示控制器的控件,前面的SearchBar是一个搜索栏,它提供一个输入搜索条件的类似于文本框的东西,后面的SearchDisplayController是一个显示搜索结果的控制器,它自带着一个searchResultsTableView搜索结果表格视图,用来显示搜索的结果的。当然,这个表格视图要想实现功能,必须要实现<UISearchBarDelegate>和<UISearchDisplayDelegate>协议。输入搜索条件时,要用到一个新知识,即谓词NSPredicate对象的使用,它类似于数据库的搜索,也用到类似于正则表达式的功能。

    用途举例:搜索当前表格中某一类型的数据。这就涉及到了两个表格视图,一个TableView和另一个searchResultsTableView,因此,需要一个区分标识,以用来决定需要显示那一个表格视图的内容。

    提示:该控件在iOS8中已经过时,被UISearchController取代。

    尽管如此,我还是用UISearchBar and SearchDisplayController控件举一个例子如下:

    1、没有搜索时:                 2.点击搜索栏时:

      

    3.显示搜索结果:                 4.取消搜索时:

      

    所有文件和storyboard布局截图如下:

    具体代码如下:

    1.创建联系人类并初始化对象

    Contact.h

    1 #import <Foundation/Foundation.h>
    2 
    3 @interface Contact : NSObject
    4 @property (copy,nonatomic)NSString *name;
    5 @property (copy,nonatomic)NSString *telphone;
    6 -(instancetype)initWithName:(NSString*)name andTelphone:(NSString*)telphone;
    7 @end

    Contact.m

     1 #import "Contact.h"
     2 
     3 @implementation Contact
     4 -(instancetype)initWithName:(NSString*)name andTelphone:(NSString*)telphone
     5 {
     6     self = [super init];
     7     if(self)
     8     {
     9         _name = [name copy];
    10         _telphone = [telphone copy];
    11     }
    12     return self;
    13 }
    14 @end

    2.在视图控制器类中实现显示表格和搜索显示功能

    ViewController.h

    1 #import <UIKit/UIKit.h>
    2 
    3 @class Contact;
    4 @interface ViewController : UIViewController
    5 @property (strong,nonatomic)Contact *contact;
    6 @property (strong, nonatomic) IBOutlet UISearchDisplayController *searchVC;//搜索栏控制器
    7 @property (strong,nonatomic)NSArray *searchedResults;//搜索栏表格数据数组
    8 @property (strong,nonatomic)NSMutableArray *contacts;//当前控制器表格数据数组
    9 @end

    ViewController.m

      1 #import "ViewController.h"
      2 #import "Contact.h"
      3 
      4 @interface ViewController ()<UITableViewDataSource,UITableViewDelegate,UISearchBarDelegate,UISearchDisplayDelegate>
      5 @property (weak, nonatomic) IBOutlet UITableView *tableView;//表格视图
      6 @property (weak, nonatomic) IBOutlet UISearchBar *searchBar;//搜索栏
      7 @property (assign,nonatomic)BOOL isSearched;//判断是搜索栏的表格视图,还是视图控制器的,刷新数据
      8 @end
      9 
     10 @implementation ViewController
     11 
     12 - (void)viewDidLoad {
     13     [super viewDidLoad];
     14     
     15     //初始化
     16     self.contacts = [NSMutableArray arrayWithCapacity:10];
     17     
     18     //创建是个联系人
     19     for(int i=0; i<10; i++)
     20     {
     21         self.contact = [[Contact alloc]initWithName:[NSString stringWithFormat:@"contact%02d",i] andTelphone:[NSString stringWithFormat:@"1873456%04d",arc4random_uniform(10000)]];
     22         
     23         [self.contacts addObject:self.contact];
     24     }
     25     
     26     //设置tableView数据源和代理
     27     self.tableView.dataSource = self;
     28     self.tableView.delegate  = self;
     29     
     30     //设置UISearchBar代理
     31     self.searchBar.delegate  = self;
     32     
     33     //初始化为NO
     34     self.isSearched = NO;
     35 }
     36 //视图显示时,刷新数据
     37 -(void)viewWillAppear:(BOOL)animated
     38 {
     39     if(self.isSearched)
     40     {
     41         [self.searchVC.searchResultsTableView reloadData];//搜索栏控制器的表格视图刷新数据
     42     }
     43     else
     44     {
     45         [self.tableView reloadData];//当前视图控制器的表格视图刷新数据
     46     }
     47 }
     48 #pragma mark -<UITableViewDataSource>
     49 //行数
     50 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
     51 {
     52     if(tableView == self.tableView)
     53     {
     54         self.isSearched = NO;
     55         return self.contacts.count;
     56     }
     57     else
     58     {
     59         self.isSearched = YES;
     60         return self.searchedResults.count;
     61     }
     62 }
     63 //设置每一个单元格的内容
     64 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
     65 {
     66     //1.根据reuseIdentifier,先到对象池中去找重用的单元格对象
     67     static NSString *reuseIdentifier = @"Cell";
     68     UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
     69     //2.如果没有找到,自己创建单元格对象
     70     if(cell == nil)
     71     {
     72         cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier];
     73     }
     74     //3.设置单元格对象的内容
     75     if(tableView == self.tableView)
     76     {
     77         self.contact = self.contacts[indexPath.row];
     78         cell.textLabel.text = self.contact.name;
     79         cell.detailTextLabel.text = self.contact.telphone;
     80     }
     81     else
     82     {
     83         self.contact = self.searchedResults[indexPath.row];
     84         cell.textLabel.text = self.contact.name;
     85         cell.detailTextLabel.text = self.contact.telphone;
     86     }
     87     return cell;
     88 }
     89 #pragma mark -<UITableViewDElegate>
     90 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
     91 {
     92     return 55;
     93 }
     94 
     95 #pragma mark -<UISearchBarDelegate>
     96 -(BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
     97 {
     98     //隐藏导航栏
     99     [self.navigationController setNavigationBarHidden:YES];
    100     return YES;
    101 }
    102 -(BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar
    103 {
    104     //显示导航栏
    105     [self.navigationController setNavigationBarHidden:NO];
    106     return YES;
    107 }
    108 -(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
    109 {
    110     //刷新表格
    111     [self.tableView reloadData];
    112 }
    113 #pragma mark -<UISearchDisplayDelegate>
    114 //使用搜索字符串过滤原始数据,找出符合条件的联系人
    115 -(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
    116 {
    117     //谓词的格式化
    118     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd]%@",searchString];
    119     
    120     //过滤原始数据
    121     self.searchedResults = [self.contacts filteredArrayUsingPredicate:predicate];
    122     
    123     return YES;
    124 }
    125 @end
  • 相关阅读:
    js判断background颜色明暗色调,以设置白/黑字体颜色
    js, 树状菜单隐藏显示
    SQL联接 外联接 内联接 完全联接 交叉联接
    zend studio设置utf8
    ul,li设置inline-block缝隙
    Php DOMDocument 中的 formatOutput
    Mysql查询一个表的所有字段名
    将php数组存取到本地文件
    绑定方法和属性
    __slots__ 属性绑定
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/4823169.html
Copyright © 2011-2022 走看看