iOS个人整理21-UISearchController搜索框与NSPredicate谓词

2024-05-11 21:32

本文主要是介绍iOS个人整理21-UISearchController搜索框与NSPredicate谓词,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、UISearchController


搜索框的用处很大,就不用废话了,在iOS8以前是用UISearchBar加代理实现的。

现在已经废弃,鼓励使用新的UISearchController

首先遵守UISearchResultsUpdating

@interface RootTableViewController ()<UISearchResultsUpdating>

再实现必须的方法-(void)updateSearchResultsForSearchController:(UISearchController *)searchController

//搜索代理方法,搜索框获得第一响应或内容变化时触发
-(void)updateSearchResultsForSearchController:(UISearchController *)searchController
{NSLog(@激活了搜索框");
}

再创建UISearchController,因为很多方法都要对搜索框进行判断,写成一个属性

@property (nonatomic,retain)UISearchController *searchC;

初始化UISearchController,把搜索框添加在tableView的headerView上

    //添加搜索栏_searchC = [[UISearchController alloc]initWithSearchResultsController:nil];//设置frame_searchC.searchBar.frame = CGRectMake(0, 0, 414, 50);//更新代理_searchC.searchResultsUpdater = self;//搜索结果不变灰_searchC.dimsBackgroundDuringPresentation = NO;//添加到headerself.tableView.tableHeaderView = _searchC.searchBar;

这样运行就能看到搜索框了,点击也会打印文字。


二、NSPredicate谓词

光有搜索框没什么卵用,还要有搜索功能,内部的功能就需要谓词来实现了

谓词的功能很强大,同时它还可以使用正则表达式,可以实现各种邮箱验证,手机号验证,以及各种查找功能。

使用的方法

1.创建谓词

NSPredicate *testPredicate = [NSPredicate predicateWithFormat:@"age < 50"];

谓词的语法也很全面:

Format后面可以跟很多:

(1)比较运算符>,<,==,>=,<=,!=
可用于数值及字符串
例:@"number > 100"


(2)范围运算符:IN、BETWEEN
例:@"number BETWEEN {1,5}"
      @"address IN {'shanghai','beijing'}"


(3)字符串本身:SELF 
例:@“SELF == ‘APPLE’"


(4)字符串相关:BEGINSWITH、ENDSWITH、CONTAINS
例:@"name CONTAIN[cd] 'ang'"   //包含某个字符串
       @"name BEGINSWITH[c] 'sh'"     //以某个字符串开头
       @"name ENDSWITH[d] 'ang'"      //以某个字符串结束
        注:[c]不区分大小写[d]不区分发音符号即没有重音符号[cd]既不区分大小写,也不区分发音符号。


(5)通配符:LIKE
例:@"name LIKE[cd] '*er*'"    //*代表通配符,Like也接受[cd].
       @"name LIKE[cd] '???er*'"


(6)正则表达式:MATCHES
例:NSString *regex = @"^A.+e$";   //以A开头,e结尾
      @"name MATCHES %@",regex

用正则表达式简单匹配一个邮箱

 正则表达式常用的/*^ ---  匹配输入字符串的开始位置$ ---  匹配输入字符串的结束位置* --- 匹配前面的子表达式任意次+ --- 匹配前面的子表达式一次或多次? --- 匹配前面的子表达式零次或一次.点 --- 匹配除“\r\n”之外的任何单个字符\d --- 匹配一个数字字符。等价于[0-9]\D --- 匹配一个非数字字符。等价于[^0-9]。\w --- 等价于[A-Za-z_0-9]。\转义*///匹配一个邮箱地址//结构 (字母数字)@(字母数字)(.)(字母2~4个)NSString *emailRegex = @"\\w+@\\w+\\.[A-Za-z]{2,4}";NSPredicate *emailPredicate = [NSPredicate predicateWithFormat:@"name MATCHES %@",emailRegex];



2.进行过滤,有两种方法,

一种是对数组进行过滤,把符合谓词条件的对象产生一个新的数组

一种是单独判断一个对象是否满足谓词条件,返回值为BOOL

 //过滤产生新的数组self.searchArray =  [NSMutableArray arrayWithArray:[_dataArray filteredArrayUsingPredicate:testPredicate]];//对单个对象依次判断if ([testPredicate evaluateWithObject:personDic]) {//添加到搜索数组当中去[_searchArray addObject:personDic];}

这里要注意一点,数组内放的对象可以是一个字典,也可以是一个类。




最后给出我写的完整的tableView上搜索框的使用


//
//  RootTableViewController.m#import "RootTableViewController.h"
#import "Person.h"@interface RootTableViewController ()<UISearchResultsUpdating>@property (nonatomic,retain)NSMutableArray *dataArray;//全部数据数组
@property (nonatomic,retain)NSMutableArray *searchArray;//搜索结果数组@property (nonatomic,retain)UISearchController *searchC;//搜索框@end@implementation RootTableViewController
//懒加载
-(NSMutableArray *)dataArray
{if (!_dataArray) {_dataArray = [[NSMutableArray alloc]init];}return _dataArray;
}
-(NSMutableArray *)searchArray
{if (!_searchArray) {_searchArray = [[NSMutableArray alloc]init];}return _searchArray;
}- (void)viewDidLoad {[super viewDidLoad];self.navigationItem.title = @"search";//添加搜索栏_searchC = [[UISearchController alloc]initWithSearchResultsController:nil];_searchC.searchBar.frame = CGRectMake(0, 0, 414, 50);//更新代理_searchC.searchResultsUpdater = self;//搜索结果不变灰_searchC.dimsBackgroundDuringPresentation = NO;//便利初始化创建数据NSArray *nameArray = [NSArray arrayWithObjects:@"王",@"李型剂",@"王青云",@"张菲菲",@"abe",@"ABe",@"aBS",@"wang@12.com", @"wan@126.cn",nil];int ageList[] = {12,43,56,123,34,44,21,22,11};for (int i = 0; i < 9; i++) {Person *person = [Person personWithName:nameArray[i] Age:(NSInteger)ageList[i]];//把全部人存到数组当中去[self.dataArray addObject:person];}//添加到headerself.tableView.tableHeaderView = _searchC.searchBar;//注册单元格[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"CELL"];}//搜索代理方法,搜索框获得第一响应或内容变化时触发
-(void)updateSearchResultsForSearchController:(UISearchController *)searchController
{//得到搜索框的文字NSString* str = searchController.searchBar.text;NSLog(@"%@",str);//创建个谓词// < > >= <= !=NSPredicate *testPredicate = [NSPredicate predicateWithFormat:@"age < 50"];//IN BETWEENNSPredicate *testPredicate_2 = [NSPredicate predicateWithFormat:@"age BETWEEN {50,100}"];NSPredicate *testPredicate_3 = [NSPredicate predicateWithFormat:@"name IN{'王','张菲菲'}"];//testPredicate
//    @"name CONTAINS[cd] 'ang'"   //包含某个字符串
//    @"name BEGINSWITH[c] 'sh'"     //以某个字符串开头
//    @"name ENDSWITH[d] 'ang'"      //以某个字符串结束NSPredicate *namePredicate = [NSPredicate predicateWithFormat:@"name CONTAINS %@",str];//[c]不区分大小写 [d]无音调  [cd]两个都不要NSPredicate *namePredicate_2 = [NSPredicate predicateWithFormat:@"name CONTAINS[c] %@ ",str];//正则表达式    //匹配一个邮箱地址//结构 (字母数字)@(字母数字)(.)(字母2~4个)NSString *emailRegex = @"\\w+@\\w+\\.[A-Za-z]{2,4}";NSPredicate *emailPredicate = [NSPredicate predicateWithFormat:@"name MATCHES %@",emailRegex];//清空搜索数组[_searchArray removeAllObjects];//过滤,这里可以换不同的谓词进行试验self.searchArray =  [NSMutableArray arrayWithArray:[_dataArray filteredArrayUsingPredicate:namePredicate_2]];for (Person *person in _searchArray) {NSLog(@"%@,%ld",person.name,person.age);}//刷新tableView[self.tableView reloadData];}#pragma mark - Table view data source- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
#warning Incomplete implementation, return the number of sectionsreturn 1;
}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
#warning Incomplete implementation, return the number of rows//如果搜索框激活if (_searchC.active) {return _searchArray.count;}return _dataArray.count;
}//cell的填充
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CELL" forIndexPath:indexPath];Person *onePerson = _dataArray[indexPath.row];//如果搜索框激活if (_searchC.active) {onePerson = _searchArray[indexPath.row];}cell.textLabel.text = [NSString stringWithFormat:@"姓名:    %@, ----- 年龄:    %ld",onePerson.name,onePerson.age];return cell;
}@end

person类

Person.h

//
//  Person.h
//  TestPredicate#import <Foundation/Foundation.h>@interface Person : NSObject@property (nonatomic,retain)NSString *name;//姓名
@property (nonatomic,assign)NSInteger age;//年龄//init
-(instancetype)initWithName:(NSString*)name Age:(NSInteger)age;//便利
+(instancetype)personWithName:(NSString*)name Age:(NSInteger)age;@end

Person.m

//
//  Person.m
//  TestPredicate
//#import "Person.h"@implementation Person
//重写初始化方法
-(instancetype)initWithName:(NSString *)name Age:(NSInteger)age
{self = [super init];if (self) {_age = age;_name = name;}return self;
}//便利构造器+(instancetype)personWithName:(NSString *)name Age:(NSInteger)age
{Person *person = [[Person alloc]initWithName:name Age:age];return person;
}@end

效果如下

         


这篇关于iOS个人整理21-UISearchController搜索框与NSPredicate谓词的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/980708

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

hdu4277搜索

给你n个有长度的线段,问如果用上所有的线段来拼1个三角形,最多能拼出多少种不同的? import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

HomeBank:开源免费的个人财务管理软件

在个人财务管理领域,找到一个既免费又开源的解决方案并非易事。HomeBank&nbsp;正是这样一个项目,它不仅提供了强大的功能,还拥有一个活跃的社区,不断推动其发展和完善。 开源免费:HomeBank 是一个完全开源的项目,用户可以自由地使用、修改和分发。用户友好的界面:提供直观的图形用户界面,使得非技术用户也能轻松上手。数据导入支持:支持从 Quicken、Microsoft Money

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大