谓词使用举个例子

by admin on 2019年9月14日

谓词使用举个例子。为了便利童鞋们更加深厚的打听UISearchController的应用,写了如此一篇文章,来探视吧~~

闲敲棋子落灯花

iOS8.0事先,找出栏基本皆以靠UISearchBar+UISearchDisplayController那对好好朋友来落到实处的。iOS8.0随后,苹果总算成全了它们,UISearchController便因而诞生。喜新厌旧一如既往都以苹果大大们的风格,UISearchController的面世公布着UISearchDisplayController的撤废,只留下了”UISearchDisplayController
has been replaced with UISearchController”这么一句话。

新近自身在写二个应用程式,在这之中要求完结搜索框寻觅成效,于是乎就想写篇博客介绍下UISearchController和搜索框的兑现。

bf88必发唯一官网 1


那么,UISearchController作为承继UISearchBar+UISearchDisplayController意志的类,为啥能后发先至而胜于蓝?而我们作为“社会主义的加班人”,又该怎么着越来越好地取其经典,去其残余?鄙人不才,因为项目需求接触了一段时间,能够说是尝到过甜头,也掉进过油柑头,借此机遇跟我们享受一下学(tian)习(keng)心得,如有不足之处,往各位看官多多富含,多多引导。

本身写的是三个气象预告APP,直接以小编应用程式中的源代码来详细介绍下寻找框的落成。

iOS8.0以前,找寻栏基本都以靠UISearchBar+UISearchDisplayController那对好基友来落到实处的。iOS8.0事后,苹果成全了它们,UISearchController便由此诞生。UISearchController的出现公布着UISearchDisplayController的丢弃。

谓词:

谓词,用来说述或剖断客体性质、特征大概合理之间涉及的词项。

Coco为大家提供了三个类NSPredicate类,该类首要用来钦点过滤器的尺度,该指标足以确切的陈述所需条件,对各样对象通过谓词进行筛选,判定是还是不是与标准相相配。谓词表示计算真值或假值的函数。

OC中的谓词操作是针对于数组类型的,与数据库中的查询操作看似,数据源就是大家要询问的数组,我们无需编写制定相当多代码就可以去操作数组,相同的时候也起到过滤的机能(按原则筛选),使用简便的谓词语句,就能够从数组中过滤出大家想要的数码。极度方便。在Java中是不曾这种本事的,可是有开源的框架已经落到实处了此功用。在iOS中能够用谓词与追寻栏
UISearchController结合使用。



注:在iOS 8.0以上版本中,
大家得以选取UISearchController来特别便于地在UITableView中增多寻找框.
而在事先版本中, 大家照旧必得运用UISearchBar +
UISearchDisplayController的结合方式。

UISearchController不相同于UISearchDisplayController的最大之处在于UISearchController承接自UIViewController,是一个无疑的视图调节器,而UISearchDisplayController承袭自NSObject,说白了是八个工具类。

谓词使用简单比方:


  • 首先创设多少个person实例对象并放入三个数组中

Person *per0 = [Person personWithName:@"Note3" age:55];
Person *per1 = [Person personWithName:@"AA" age:20];
Person *per2 = [Person personWithName:@"DD" age:25];
Person *per3 = [Person personWithName:@"GG" age:92];
Person *per4 = [Person personWithName:@"KK" age:38];
Person *per5 = [Person personWithName:@"2324" age:138];
Person *per6 = [Person personWithName:@"詹姆斯" age:81];
Person *per7 = [Person personWithName:@"周琦" age:18];
Person *per8 = [Person personWithName:@"韦德" age:46];
Person *per9 = [Person personWithName:@"HUAWEI3x" age:67];

NSArray *persons = [NSArray arrayWithObjects:per0, per1, per2, per3, per4, per5, per6, per7, per8, per9, nil];

//定义谓词对象,谓词对象中满含了过滤条件(筛选的尺度)
//条件1: 年龄大于180的

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age > 180"];

//使用谓词条件过滤数组中的成分,过滤之后回来查询的结果

NSArray *array = [persons filteredArrayUsingPredicate:predicate];
 for (Person *per in array) 
{
    NSLog(@"条件1 age >180 --> 名字:%@, 年龄:%ld", per.name, per.age);
}

结果截图

//条件2 年华小于50还要名叫韦德的

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = '韦德' && age < 50"];
NSArray *array = [persons filteredArrayUsingPredicate:predicate];
for (Person *per in array) {
    NSLog(@"条件2 age < 50 && name = 韦德 --> %@, %ld", per.name, per.age);
}

结果截图

//条件3 使用in (包含)

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name IN {'D','AA', '韦德'} "];
//这句话意思找到在IN后面的这个数组中元素作为名字的人,完全匹配才行

NSArray *array = [persons filteredArrayUsingPredicate:predicate];
NSLog(@"满足条件人数 %ld 个", array.count);
for (Person *per in array) {
NSLog(@"条件3结果 %@, %ld", per.name, per.age);
}

条件3结果

//条件4 name以H开头的 (beginswith)

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name beginswith 'H' "];

NSArray *array = [persons filteredArrayUsingPredicate:predicate];
NSLog(@"满足条件的人数 %ld 个", array.count);
for (Person *per in array) {
NSLog(@"条件4结果 %@, %ld", per.name, per.age);
}

条件4结果

//条件5 name以e3结尾的 (endswith)

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name endswith 'e3'"];

NSArray *array = [persons filteredArrayUsingPredicate:predicate];
NSLog(@"满足条件人数 %ld 个", array.count);
for (Person *per in array) {
NSLog(@"条件5结果 %@, %ld", per.name, per.age);
}

条件5结果

//条件6 name中富含32的(不管在名字中的地方)

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains '32'"];

NSArray *array = [persons filteredArrayUsingPredicate:predicate];
NSLog(@"满足条件 %ld 个", array.count);
for (Person *per in array) {
NSLog(@"条件6结果 %@, %ld", per.name, per.age);
}

条件6结果

//条件7 name中相应岗位有好几字符 ?表示叁个字符 *代表0个或七个字符

//predicate = [NSPredicate predicateWithFormat:@"name like '*3?'"];
这个条件意思 : 第二个字符是3后面几个字符都行
//predicate = [NSPredicate predicateWithFormat:@"name like '?a*'"];  
这个条件意思是:倒数第二个字符是a a前面不管几个字符都行
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like '*姆*'"];
这个条件意思是: 名字是三个字符  且第二个字符是姆的

NSArray *array = [persons filteredArrayUsingPredicate:predicate];
NSLog(@"%ld", array.count);
for (Person *per in array) {
NSLog(@"条件7结果 %@, %ld", per.name, per.age);
}

条件7结果

������������������

谓词使用举个例子。1.UISearchBar+UISearchDisplayController概述

合法对UISearchBar的定义如下:

The UISearchBar class implements a text field control for text-based
searches. The control provides a text field for entering text, a
search button, a bookmark button, and a cancel button. The UISearchBar
object does not actually perform any searches. You use a delegate, an
object conforming to
the UISearchBarDelegate protocol,
to implement the actions when text is entered and buttons are clicked.

大概的话,UISearchBar承袭自UIView,是三个力所能致达成文字寻觅的文书输入框。但是已经找不到UISearchDisplayController的合法介绍了,只找到了上边一段话:

Important:UISearchDisplayController is deprecated in iOS 8. (Note
that UISearchDisplayDelegate is
also deprecated.) To manage the presentation of a search bar and
display search results in iOS 8 and later, instead
useUISearchController.

苹果并从未发布UISearchBar也一并抛弃,不过UISearchController本人已经有了多少个UISearchBar,丰裕满意绝大非常多的需要(剩下的那一小部分,假使有的话应该是UISearchBar的定制化)。因而即便您投入了UISearchController的心怀,就请忘掉那多个类吧。


bf88必发唯一官网 2

bf88必发唯一官网 3

2.UISearchBar+UISearchDisplayController使用

官方对那多个类的使用方法有详细的证实(UISearchBar和UISearchDisplayController),这里结合本人做的Demo讲讲笔者的思绪。

第一步:初始化UISearchBar和UISearchDisplayController

UISearchDisplayController *_searchDisplayController;

UISearchBar *_searchBar;

_searchBar= [[UISearchBar alloc]
initWithFrame:CGRectMake(0,0,SCREEN_WIDTH,44)];

_searchDisplayController= [[UISearchDisplayController alloc]
initWithSearchBar:_searchBar contentsController:self];

_searchDisplayController.delegate=self;

_searchDisplayController.searchResultsDelegate=self;

_searchDisplayController.searchResultsDataSource=self;

[self.view addSubview:_searchBar];

(1)_searchBar需求早先化Frame,这里的SCREEN_WIDTH是荧屏的幅度;

(2)_searchDisplayController初步化须求传入五个值,三个是搜索框UISearchBar,另多个是用来呈现搜索内容的UIViewController;

(4)需求设置UISearchDisplayController的代理,delegate肩负监听并拍卖_searchBar中的文字变化,searchResultsDelegate和searchResultsDataSource担当呈现并拍卖寻觅内容,熟练UITableViewController的开辟者确定对那五个delegate不生分。

(4)本例中的self是叁个UIViewController,整个分界面也不全皆以tableview。借使选取UITableViewController的话,平日用self.tableView.tableHeaderView
= _searchBar来放置_searchBar的岗位。效果同样,都以放在最上部。

其次步:完结UISearchDisplayDelegate和搜索逻辑

#pragma mark – UISearchDisplayDelegate


(BOOL)searchDisplayController:(UISearchDisplayController*)controller
shouldReloadTableForSearchString:(NSString*)searchString

{

// 完结搜索逻辑代码

returnYES;

}

searchString就是在_searchBar输入的文书内容,借使将落到实处寻找逻辑的代码放在这几个函数里,那么表示落成的搜寻方式是实时搜索,即边输入边研究。若是想透过其余的轩然大波(举例点击键盘的肯定开关)发轫查找逻辑,那么必要贯彻任何的delegate,小编未有用过另外方法,就不在这里布鼓雷门了。实时找寻的优势在于给客商的申报效果好,劣点在于消耗的能源大。

其三步:既然已经赢得找出结果,那么未来将它们浮现出来吗

NSMutableArray *_searchResultArray;

达成上一步的索求逻辑后,本例将结果保存到_searchResultArray。

// 寻觅实现后可别忘记刷新tableview

[_searchDisplayController.searchResultsTableView reloadData];

#pragma mark – UITableViewDataSource,UITableViewDelegate

– (NSInteger)tableView:(UITableView*)tableView
numberOfRowsInSection:(NSInteger)section

{

return _searchResultArray.count;

}

– (UITableViewCell*)tableView:(UITableView*bf88必发唯一官网 ,)tableView
cellForRowAtIndexPath:(NSIndexPath*)indexPath

{

// 依照本人的供给去展现cell

return cell;

}

– (void)tableView:(UITableView*)tableView
didSelectRowAtIndexPath:(NSIndexPath*)indexPath

{

[tableView deselectRowAtIndexPath:indexPath animated:YES];

[_searchDisplayController setActive:NO];

// 完结接纳有个别结果后的逻辑代码

}

深信不疑聪明的开荒者们曾经无需小编再解释那四个章程的用处,所以那边就一笔带过了,跟完结UITableViewController的方法完全一样。


初始化UISearchController

// 搜索界面的状态,只读属性。@property (nonatomic, assign, getter = isActive) BOOL active;// 决定在搜索时,底层的内容是否要变暗。@property (nonatomic, assign) BOOL dimsBackgroundDuringPresentation; // 搜索栏使用的时候是否需要隐藏NavigationBar,默认值为true。@property (nonatomic, assign) BOOL hidesNavigationBarDuringPresentation; // 自定义的搜索结果Controller@property (nullable, nonatomic, strong, readonly) UIViewController *searchResultsController;// 搜索栏,只读属性。@property (nonatomic, strong, readonly) UISearchBar *searchBar;// UISearchController的代理@property (nullable, nonatomic, weak) id <UISearchControllerDelegate> delegate;// UISearchResultsUpdating的代理@property (nullable, nonatomic, weak) id <UISearchResultsUpdating> searchResultsUpdater;

// 控件的样式@property(nonatomic) UIBarStyle barStyle;// UISearchBarDelegate的代理@property(nullable,nonatomic,weak) id<UISearchBarDelegate> delegate;// 控件上的显示文字@property(nullable,nonatomic,copy) NSString *text; // 控件上方的提示文字@property(nullable,nonatomic,copy) NSString *prompt; // 控件的占位提示文字@property(nullable,nonatomic,copy) NSString *placeholder;// 控件是否透视效果@property(nonatomic,assign,getter=isTranslucent) BOOL translucent

3.总结

本篇简单介绍了UISearchBar+UISearchDisplayController的定义和动用方法,回想了下认为并未有怎么干货,各位看官老汉子将就将就吧。下一篇必然会出现主人公UISearchController,敬请期待!

bf88必发唯一官网 4

主意由上到下的实行种种

选择UISearchController要传承UISearchResultsUpdating协议,
搜索必得完毕UISearchResultsUpdating方法.通过UISearchController的active属性来判别输入框是不是处在active状态,然后更新UITableview

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

// 更新搜索结果- updateSearchResultsForSearchController:(UISearchController *)searchController;

// 开始编辑- searchBarShouldBeginEditing:(UISearchBar *)searchBar; // 结束编辑- searchBarShouldEndEditing:(UISearchBar *)searchBar; // 正在编辑- searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:range replacementText:(NSString *)text

bf88必发唯一官网 5

bf88必发唯一官网 6

搜寻完之后,将追寻框移除

上代码,先增多代理

bf88必发唯一官网 7

@interface<UITableViewDelegate,UITableViewDataSource,UISearchResultsUpdating,UISearchControllerDelegate,UISearchBarDelegate>@end

意义图如下:

将在跨方法运用的东东写成属性

bf88必发唯一官网 8

@property (nonatomic, strong) UISearchController *searchController;@property (nonatomic, strong) UITableView *tableView;// 存数据的数组@property (nonatomic, strong) NSMutableArray *dataArray;// 搜索到的结果数组@property (nonatomic, strong) NSMutableArray *searchArray;

具体方法达成

- viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self createSearch]; [self createTableView]; [self createArray];}- createTableView { self.tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain]; _tableView.delegate = self; _tableView.dataSource = self; [self.view addSubview:_tableView]; _tableView.tableHeaderView = _searchController.searchBar; [_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:reusableIdentifier];}- createArray { // 创建数据数组 self.dataArray = [NSMutableArray array]; // 给数据数组赋初值 for (int i = 100; i <= 1000; i++) { [_dataArray addObject:[NSString stringWithFormat:@"%d",i]]; } // 为了全面测试,数据数组增加英文与中文 [_dataArray addObject:@"Small Tiger"]; [_dataArray addObject:@"冠军"]; // 创建结果数组 self.searchArray = [NSMutableArray array];}- createSearchController { self.searchController = [[UISearchController alloc]initWithSearchResultsController:nil]; _searchController.searchResultsUpdater = self; _searchController.searchBar.frame = CGRectMake(_searchController.searchBar.frame.origin.x, _searchController.searchBar.frame.origin.y, _searchController.searchBar.frame.size.width, 44.0); _searchController.dimsBackgroundDuringPresentation = NO;}

UITableView左券方法

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (_searchController.active) { return _searchArray.count; } else { return _dataArray.count; }}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reusableIdentifier]; if (_searchController.active) { cell.textLabel.text = _searchArray[indexPath.row]; } else { cell.textLabel.text = _dataArray[indexPath.row]; } return cell; }

UISearchResultsUpdating左券章程

- updateSearchResultsForSearchController:(UISearchController *)searchController { NSString *searchString = self.searchController.searchBar.text; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[c] %@",searchString]; // 移除原数据 if (_searchArray != nil) { [self.searchArray removeAllObjects]; } // 过滤数据 self.searchArray = [NSMutableArray arrayWithArray:[_dataArray filteredArrayUsingPredicate:predicate]]; // 刷新表格 [_tableView reloadData];}

这么就总结落成了UISearchController与UITableView的涉嫌应用

bf88必发唯一官网 9

光有搜索框没什么卵用,还要有追寻效果,内部的功力就须求谓词来促成了

谓词的效应很庞大,同时它还足以运用正则表达式,能够完毕种种邮箱验证,手提式有线电话机号验证,以及各类搜索效能。

  • 逻辑运算符 && AND || O君越 都足以用
  • IN包含
  • 模糊查询
    • 以……开头 BEGINSWITH
    • 以……结尾 ENDSWITH
    • 包含….字符 CONTAINS
  • 用like进行模糊查询通配符:*代模范性个字符 ?表示单个字符like *a
    以a结尾like a* 以a开头like *a* 包含a字符like ?a*
    第三个字符为a的字符串

创建Book类

Book.h@interface Book : NSObject{ NSInteger _price; NSString* _bookName;}- (instancetype)initWithPrice:(NSInteger)price andBookName:(NSString *)bookName;@endBook.m#import "Book.h"@implementation Book- (instancetype)initWithPrice:(NSInteger)price andBookName:(NSString *)bookName { if (self = [super init]) { _price = price; _bookName = bookName; } return self;}- (NSString *)description { return [NSString stringWithFormat:@"Book price:%li,named %@",_price,_bookName];}@endmain.mint main(int argc, const char * argv[]) { @autoreleasepool { Book* book1 = [[Book alloc] initWithPrice:20 andBookName:@"C Programming"]; Book* book2 = [[Book alloc] initWithPrice:32 andBookName:@"C++ Programming"]; Book* book3 = [[Book alloc] initWithPrice:18 andBookName:@"Java Programming"]; Book* book4 = [[Book alloc] initWithPrice:45 andBookName:@"OC guiding"]; Book* book5 = [[Book alloc] initWithPrice:28 andBookName:@"iOS guiding"]; NSArray* books = [NSArray arrayWithObjects:book1,book2,book3,book4,book5, nil]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"price > %i",30]; NSArray *filterArray = [books filteredArrayUsingPredicate:predicate]; NSLog(@"%@",filterArray);// 逻辑运算符 和 IN predicate = [NSPredicate predicateWithFormat:@"bookName IN {'C Programming','C++ Programming'} AND price > 30"]; filterArray = [books filteredArrayUsingPredicate:predicate]; NSLog(@"%@",filterArray);// 模糊查询 和 用通配符查询 predicate = [NSPredicate predicateWithFormat:@"bookName CONTAINS 'guiding' || bookName like '*Program*' "]; //包含guiding或者包含Program filterArray = [books filteredArrayUsingPredicate:predicate]; NSLog(@"%@",filterArray); } return 0;}

一青年经由某地,遇到壹位老者,问:“这里怎么?”老者反问:“你家乡怎样?”青少年答:“糟透了!我很反感。”老者说:“这里也同样糟。”后来又来了个青少年问同样难题,老者也一律反问,青少年回答说:“笔者家乡很好,作者很怀恋。”老者便说:“这里也一直以来好。”旁听者感到讶异,问大人为啥前后说法不均等呢?老者说:“你管得着啊?”

不适的时候摸摸本人的胸,告诉本人是个男子汉,要坚强~

bf88必发唯一官网 10

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图