UISearchBar及NSPredict详解

苹果给我们封装好的搜索控件,控件很简单,不过就那个匹配还是需要动点脑子的,我们在搜索的时候肯定有各种匹配规则,下边给的demo就是一个搜索的demo,并且附上谓词的详解。

[objc]view plaincopy

@interfaceViewController ()

{

UISearchBar*mSerchBar;

UITableView*mTableView;

BOOLmIsSearch;

NSArray*mDataArray;

NSArray*mSearchResultArray;

}

@end

@implementationViewController

- (void)viewDidLoad {

[superviewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

if(!mSerchBar) {

mSerchBar = [[UISearchBaralloc]initWithFrame:CGRectMake(0,50, [[UIScreenmainScreen]bounds].size.width,50)];

mSerchBar.keyboardType= UIKeyboardTypeDefault;

mSerchBar.showsCancelButton=YES;

mSerchBar.prompt=@"查找图书";

mSerchBar.placeholder=@"请输入图书名称";

mSerchBar.delegate=self;

}

[self.viewaddSubview:mSerchBar];

if(!mTableView) {

mTableView = [[UITableViewalloc]initWithFrame:CGRectMake(0,100, [[UIScreenmainScreen]bounds].size.width,200)style:UITableViewStylePlain];

mTableView.backgroundColor= [UIColorredColor];

mTableView.rowHeight=50;

//mTableView.tableHeaderView = mSerchBar;

mTableView.delegate=self;

mTableView.dataSource=self;

}

[self.viewaddSubview:mTableView];

mIsSearch =NO;

if(!mDataArray) {

mDataArray = [NSArrayarrayWithObjects:@"Java讲义",

@"轻量级Java EE企业应用实战",

@"Android讲义",

@"Ajax讲义",

@"HTML5/CSS3/JavaScript讲义",

@"iOS讲义",

@"XML讲义",

@"经典Java EE企业应用实战"

@"Java入门与精通",

@"Java基础教程",

@"学习Java",

@"Objective-C基础",

@"Ruby入门与精通",

@"iOS开发教程",nilnil];

}

if(!mSearchResultArray) {

mSearchResultArray = [NSArrayarray];

}

/*

谓词表达式由表达式,运算符和值组成

*/

//1.比较运算符 >,<,=(==),<=,>=,!=,BETWEEN; BETWEEN格式为BETWEEN {MIN,MAX},大于等于MIN,小于等于MAX

NSNumber*testNumber =@123;

NSPredicate*pre = [NSPredicatepredicateWithFormat:@"SELF BETWEEN {100,200}"];

if([preevaluateWithObject:testNumber]) {

NSLog(@"%@",testNumber);

}

//2.逻辑运算符 AND(&&),OR(||),NOT(!)

NSArray*testArray = @[@1,@2,@123,@456];

NSPredicate*preLogic = [NSPredicatepredicateWithFormat:@"NOT(SELF > 123 && SELF < 2)"];

NSArray*logicArr = [testArrayfilteredArrayUsingPredicate:preLogic];

NSLog(@"%@",logicArr);

//3.字符串比较运算符 BEGINSWITH,ENDSWITH,CONTAINS,LIKE,MATCHES

/*

BEGINSWITH '',ENDSWITH '',CONTAINS '', LIKE '', MATCHES '';

不区分大小写,可以加上[c](CASE INSENSITIVE);不区分重音符号,可以加上[d];既不区分大小写,也不区分重音符号,就加上[cd];

*/

NSString*testStr =@"jack";

NSPredicate*preStr = [NSPredicatepredicateWithFormat:@"SELF LIKE[cd] '?c*'"];

if([preStrevaluateWithObject:testStr]) {

NSLog(@"%@",testStr);

}

//4.集合运算符

/*

ANY,SOME:集合中任意一个元素满足条件,就返回YES.

ALL:集合中所有元素都满足条件,返回true

NONE:

IN: 等价于SQL语句中的IN运算符,只有当左边表达式或值出现在右边的结合中才返回yes.

*/

NSArray*filterArr = @[@"ab",@"abc"];

NSArray*allArr = @[@"a",@"ab",@"abc",@"ac"];

NSPredicate*preArr = [NSPredicatepredicateWithFormat:@"NOT (SELF IN (%@))",filterArr];

NSArray*result = [allArrfilteredArrayUsingPredicate:preArr];

NSLog(@"%@",result);

//5.直接量

/*

FALSE,NO

TRUE,YES

NULL,NIL

SELF

"string",'string':代表字符串

*/

//6.保留字(关键字)

/*

AND,OR,NOT,IN,ALL,SOME,NONE,LIKE,ANY,CASEINSENSITIVE,CI,MATCHES,CONTAINS,BEGINSWITH,ENDSWITH,BETWEEN,NULL,NIL,SELF,TRUE,YES,FALSE,NO,FIRST,LAST,SIZE,ANYKEY,SUBQUERY,CAST,TRUEPREDICATE,FALSEPREDICATE

建议这些关键字都用大写(理论上来说是不区分大小写的)

*/

//二:简单使用

// 例1:

YAOModel*yao = [YAOModelallocPersonWithName:@"yao"age:20sex:YaoPresonSexMale];

YAOModel*wang = [YAOModelallocPersonWithName:@"wang"age:18sex:YaoPresonSexFamale];

NSPredicate*preName = [NSPredicatepredicateWithFormat:@"(mName LIKE[c] 'y*') AND (mAge > 20)"];

BOOLjudgeYao = [preNameevaluateWithObject:yao];

BOOLjudgeWang = [preNameevaluateWithObject:wang];

NSString*testPhoneStr =@"13345678919";

judgeYao = [selfcheckPhoneNumber:testPhoneStr];

NSString*testSpecial =@"!{";

judgeYao = [selfcheckSpecialCharacter:testSpecial];//应该是YES,但是结果是NO,说明谓词还是没有我们想象中的那么好,没有正则匹配匹配的好,所以这个东西还是需要正则来匹配的

//2.在谓词中使用占位符参数

/*

%K: 动态传入属性名

%@: 动态设置属性值

除此之外,还可以在谓词表达式中使用动态改变的属性值,就像环境变量一样

NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF CONTAINS $VALUE"];

上述表达式中,$VALUE是一个可以动态变化的值,它其实最后是在字典中的一个key,所以可以根据你的需要写不同的值,但是必须有$开头,随着程序改变$VALUE这个谓词表达式的比较条件就可以动态改变。

*/

NSArray*LastArr = @[[YAOModelallocPersonWithName:@"jack"age:20sex:YaoPresonSexFamale],[YAOModelallocPersonWithName:@"wang"age:22sex:YaoPresonSexFamale],[YAOModelallocPersonWithName:@"yao"age:22sex:YaoPresonSexMale]];

//1.创建一个property来存放属性名,value来存放属性值

NSString*property =@"mName";

NSString*value =@"jack";

//其实就是一个代替,property由%K在占位,value由%@在占位

NSPredicate*predict = [NSPredicatepredicateWithFormat:@"%K CONTAINS %@",property,value];

NSArray*newArr = [LastArrfilteredArrayUsingPredicate:predict];

//2.

NSPredicate*pred = [NSPredicatepredicateWithFormat:@"%K > $VALUE",@"mAge"];

NSPredicate*pred1= [predpredicateWithSubstitutionVariables:@{@"VALUE":@18}];

NSArray*newArr1= [LastArrfilteredArrayUsingPredicate:pred1];

}

//例2: 判断手机号是否正确输入

- (BOOL)checkPhoneNumber:(NSString*)phoneNumberStr {

NSString*regex =@"^[1][3-8]\\d{9}$";

NSPredicate*pre = [NSPredicatepredicateWithFormat:@"SELF MATCHES %@",regex];

return[preevaluateWithObject:phoneNumberStr];

}

//例三:判断是否含有特殊字符

- (BOOL)checkSpecialCharacter:(NSString*)str {

//仿照判断手机号

NSString*regex =@"[`~!@#$^&*()=|{}':;',\\[\\].<>/?~!@#¥……&*()——|{}【】‘;:”“'。,、?]";

NSPredicate*pre = [NSPredicatepredicateWithFormat:@"SELF MATCHES %@",regex];

return[preevaluateWithObject:str];

}

#pragma mark -- UITableViewDelegate UITableViewDataSource

- (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView {

return1;

}

- (NSInteger)tableView:(UITableView*)tableViewnumberOfRowsInSection:(NSInteger)section {

returnmIsSearch?mSearchResultArray.count:mDataArray.count;

}

- (UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath*)indexPath {

staticNSString*cellId =@"searchCell";

UITableViewCell*cell = [tableViewdequeueReusableCellWithIdentifier:cellId];

if(!cell) {

cell = [[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:cellId];

}

cell.textLabel.text= mIsSearch?[mSearchResultArrayobjectAtIndex:indexPath.row]:[mDataArrayobjectAtIndex:indexPath.row];

returncell;

}

#pragma mark - UISearchBarDelegate

- (void)searchBarTextDidBeginEditing:(UISearchBar*)searchBar {

}

- (void)searchBarTextDidEndEditing:(UISearchBar*)searchBar {

}

- (void)searchBar:(UISearchBar*)searchBartextDidChange:(NSString*)searchText {

[selffilterBySubStr:searchText];

}

- (void)searchBarSearchButtonClicked:(UISearchBar*)searchBar {

[selffilterBySubStr:searchBar.text];

[mTableViewreloadData];

}

- (void)searchBarCancelButtonClicked:(UISearchBar*)searchBar __TVOS_PROHIBITED {

mIsSearch =NO;

[mTableViewreloadData];

}

- (void)searchBarResultsListButtonClicked:(UISearchBar*)searchBar NS_AVAILABLE_IOS(3_2) __TVOS_PROHIBITED {

}// called when search results button pressed

#pragma mark - private function

- (void)filterBySubStr:(NSString*)subStr {

mIsSearch =YES;

NSPredicate*pre = [NSPredicatepredicateWithFormat:@"SELF CONTAINS[c] %@",subStr];

mSearchResultArray = [mDataArrayfilteredArrayUsingPredicate:pre];

[mTableViewreloadData];

}

YaoModel:

[objc]view plaincopy

typedefNS_ENUM(NSInteger, YaoPresonSex) {

YaoPresonSexMale =0,

YaoPresonSexFamale

};

@interfaceYAOModel : NSObject

@property(nonatomic,copy)NSString*mName;

@property(nonatomic, assign) NSInteger mAge;

@property(nonatomic, assign) YaoPresonSex mSex;

+ (instancetype)allocPersonWithName:(NSString*)nameage:(NSInteger)agesex:(YaoPresonSex)sex;

[objc]view plaincopy

@implementationYAOModel

+ (instancetype)allocPersonWithName:(NSString*)nameage:(NSInteger)agesex:(YaoPresonSex)sex {

YAOModel*model = [[YAOModelalloc]init];

model.mName= name;

model.mAge= age;

model.mSex= sex;

returnmodel;

}

NSPredict使用

数组中有多个字典,字典中有name,code,extcode,jianpin等key,我们匹配的时候需要匹配name, code,extcode,jianpin这四个key,如下:

NSArray*resultArr = [NSArrayarray];

NSMutableArray*cacheResultArr = [NSMutableArrayarray];

NSString*property;

if(mResultCodeArr && mResultCodeArr.count >0) {

[mResultCodeArr removeAllObjects];

}

// name code extcode jianpin

NSArray*searchArr =@[@"name",@"code",@"extcode",@"jianpin"];

for(inti =0; i

property = searchArr[i];

NSPredicate*predict = [NSPredicate predicateWithFormat:@"%K CONTAINS %@",property,subStr];

resultArr = [mCodeArr filteredArrayUsingPredicate:predict];

for(NSString*contentStrinresultArr) {

[cacheResultArraddObject:contentStr];

}

}

//去重

if(cacheResultArr.count>0) {

for(inti =0; i

if(![mResultCodeArr containsObject:cacheResultArr[i]]) {

[mResultCodeArr addObject:cacheResultArr[i]];

}

}

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容