㈠ 为什么一些正则运算再nspredicate没用 了
例如:判断字符串首字母是否为字母。
Objective-c代码
NSString *regex = @"[A-Za-z]+";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
if ([predicate evaluateWithObject:aString]) {
}
判断Array中是否包含某一规则的对象,并返回一个数组:
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS %@", regex];
并调用:- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate; 方法即可。
获得一个数组中某些对象除外的数组:
NSPredicate *notPredicate = [NSPredicate predicateWithFormat:@"NOT (SELF in %@)", arrayFilter2];且还是要调用- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate; 方法。
同样,如果我们想找出某个范围内的对象,创建如下Predicate (这里可以用到所有的比较操作符): NSPredicate *pre = [NSPredicate predicateWithFormat:@"self.*** < 5"];
并调用:- (BOOL)evaluateWithObject:(id)object;方法。
在这里啰嗦一句,如果只是在数组中查找是否存在对象时用indexOfObject,如果不存在则返回为NSNotFound.
㈡ ios开发 nspredicate中怎么用sum
//找出一个数组
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *defaultPath = [[NSBundle mainBundle] resourcePath];
NSError *error;
NSArray *directoryContents = [fileManager contentsOfDirectoryAtPath:defaultPath error:&error]
//匹配字符串,反回结果, SELF==表示数组中每一个元素
NSString *match = @"imagexyz-999.png";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF == %@", match];
NSArray *results = [directoryContents filteredArrayUsingPredicate:predicate];
//近似匹配字符串,类似SQL中的语法
NSString *match = @"imagexyz*.png";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF like %@", match];
NSArray *results = [directoryContents filteredArrayUsingPredicate:predicate];
//不区分大小写匹配
NSString *match = @"imagexyz*.png";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF like[cd] %@", match];
NSArray *results = [directoryContents filteredArrayUsingPredicate:predicate];
//正则匹配
NSString *match = @"imagexyz-//d{3}//.png";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF matches %@", match];
NSArray *results = [directoryContents filteredArrayUsingPredicate:predicate];
㈢ ios nspredicate 判断一个字典里是否有匹配的字符转
字典里是否有匹配的字符
// 创建出10个person对象,并加入数组
NSMutableArray *muArray = [NSMutableArray array];
for (int i = 0; i <10; i++) {
Person *person = [Person personWithName:[NSString stringWithFormat:@"zhang%d",i] Age:i];
[muArray addObject:person];
}
NSLog(@"muArray = %@", muArray);
1)比较运算符
/**比较运算符
* >:大于
* <:小于
* >=:大于等于
* <=:小于等于
* =,==:等于
* !=,<>:不等于
* between:左边的表达式等于右边的表达式的值或者介于它们之间。右边是一个有两个指定上限和下限的数值的数列(指定顺序的数列)。比如,1 BETWEEN { 0 , 33 },或者$INPUT BETWEEN { $LOWER, $UPPER }。
**/
// 例子:年龄属性大于3岁,注意:键路径不能用单引号引起来,否则会报错
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age > 3"];
㈣ coredata应用开发实践指南这本书怎么样
第一步:创建一个 DataDemo.xcdatamodel 文件,在其中建一个实体名字为 Entity1 ,实体中建两个字段 id 和 name。
第二步:为项目添加 CoreData.framework 框架,然后在 .pch 中加入 #import <coredata/coredata.h>
第三步:在 app delegate 中定义 core data 的相关对象(同时完成它们的初始化工作)
.h 文件:
#import <coredata/coredata.h>
@private
NSManagedObjectModel *managedObjectModel;
NSManagedObjectContext *managedObjectContext;
NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
- (NSString*) applicationDocumentsDirectory;
- (void) saveContext;
.m 文件:
@synthesize managedObjectModel;
@synthesize managedObjectContext;
@synthesize persistentStoreCoordinator;
- (void)dealloc {
[managedObjectModel release];
[managedObjectContext release];
[persistentStoreCoordinator release];
[super dealloc];
}
- (NSString*)applicationDocumentsDirectory
{
//return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSArray *paths = (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
return basePath;
//return [NSURL URLWithString:basePath];
}
- (void)saveContext{
NSError *error = nil;
NSManagedObjectContext *objectContext = self.managedObjectContext;
if (objectContext != nil)
{
if ([objectContext hasChanges] && ![objectContext save:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
}
- (NSManagedObjectContext *)managedObjectContext
{
if (managedObjectContext != nil) {
return managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return managedObjectContext;
}
- (NSManagedObjectModel *)managedObjectModel
{
if (managedObjectModel != nil) {
return managedObjectModel;
}
//从本地所有 xcdatamodel 文件中获得这个 CoreData 的数据模板
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
return managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
//数据库名为TestDB.sqlite
NSURL *storeUrl = [NSURL fileURLWithPath:[[self applicationDocumentsDirectory] :@"TestDB.sqlite"]];
NSError *error;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nilURL:storeUrl options:nil error:&error]) {
NSAssert(0, @"persistentStoreCoordinator init failed!");
}
return persistentStoreCoordinator;
}
- (void)applicationWillTerminate:(UIApplication *)application
{
NSError *error;
if (managedObjectContext != nil) {
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
NSAssert(0, @"save changes failed when terminage application!");
}
}
}
第四步:在相关的 viewcontroller 中操作数据,基本的 core data 操作代码如下:
NSError *error;
testSQLiteAppDelegate *app = (testSQLiteAppDelegate*)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = app.managedObjectContext;
//1、插入
NSManagedObject *newManagedObject = nil;
newManagedObject = [NSEntityDescription :@"Entity1" inManagedObjectContext:context];
[newManagedObject setValue:[NSNumber numberWithInt:1] forKey:@"id"];
[newManagedObject setValue:@"i love you" forKey:@"name"];
if (![context save:&error]){
NSLog (@"The error is: %@", [error userInfo]);
}
else
{
NSLog (@"The newManagedObject's id is: %@", [newManagedObject valueForKey:@"id"]);
}
//2、查询
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity1" inManagedObjectContext:context];
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"id" ascending:YES];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, sortDescriptor2, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:20];
NSArray *objects = [context executeFetchRequest: fetchRequest error:&error];
if (objects == nil)
{
NSLog(@"There was an error!");
}
else {
for (NSManagedObject *oneObject in objects)
{
NSLog(@"%@",[oneObject valueForKey:@"name"]);
}
}
//3、删除
[context deleteObject:[objects objectAtIndex:0]];
if (![context save:&error]) {
exit(-1);
}
这里更详细的补充一点关于 core data 的操作代码:
1、条件过滤:选择 cid=1 的数据
- (NSFetchedResultsController*) fetchedResultsController
{
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"cid=1"];
[fetchRequest setPredicate:predicate];
}
2、通用代码,在 viewcontroller 里面会用到:
TestViewController.h 的代码:
@interface TestViewController : UITableViewController <>
{
NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;
}
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
- (void)configureCell:(UITableViewCell *)cell withCategory:(Category *)category;
@end
TestViewController.m 的代码:
-(NSFetchedResultsController *)fetchedResultsController
{
if (fetchedResultsController != nil)
{
return fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Category" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *nameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *arraySortDescriptor = [[NSArray alloc] initWithObjects:nameDescriptor, nil];
[fetchRequest setSortDescriptors:arraySortDescriptor];
NSPredicate *predicate = [NSPredicate predicateWithFormat:cidString];
[fetchRequest setPredicate:predicate];
NSFetchedResultsController *frController = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"name" cacheName:@"Root"];
frController.delegate = self;
self.fetchedResultsController = frController;
[frController release];
[fetchRequest release];
[nameDescriptor release];
return fetchedResultsController;
}
- (void)controllerWillChangeContent:(NSFetchedResultsController *)
{
[self.tableView beginUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType: (NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
{
UITableView *tableView = self.tableView;
switch (type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] withCategory:anObject];
break;
default:
break;
}
}
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
switch(type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void) controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView endUpdates];
}
㈤ ios开发中NSArray怎么用NSPredicate来过滤数组内容
//找出一个数组
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *defaultPath = [[NSBundle mainBundle] resourcePath];
NSError *error;
NSArray *directoryContents = [fileManager contentsOfDirectoryAtPath:defaultPath error:&error]
//匹配字符串,反回结果, SELF==表示数组中每一个元素
NSString *match = @"imagexyz-999.png";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF == %@", match];
NSArray *results = [directoryContents filteredArrayUsingPredicate:predicate];
//近似匹配字符串,类似SQL中的语法
NSString *match = @"imagexyz*.png";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF like %@", match];
NSArray *results = [directoryContents filteredArrayUsingPredicate:predicate];
//不区分大小写匹配
NSString *match = @"imagexyz*.png";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF like[cd] %@", match];
NSArray *results = [directoryContents filteredArrayUsingPredicate:predicate];
//正则匹配
NSString *match = @"imagexyz-//d{3}//.png";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF matches %@", match];
NSArray *results = [directoryContents filteredArrayUsingPredicate:predicate];
㈥ 1,searchbar怎样去掉背景的颜色storyboard里只能设置background
1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现 Color无法使用)。
其实在代码里还是可以设置的,那就是删除背景view
[[self.searchBar.subviews objectAtIndex:0] removeFromSuperview];
2,NSDate:
字母 日期或时间元素 表示 示例
G Era 标志符 Text AD
y 年 Year 1996 96
M 年中的月份 Month July; Jul; 07
w 年中的周数 Number 27
W 月份中的周数 Number 2
D 年中的天数 Number 189
d 月份中的天数 Number 10
F 月份中的星期 Number 2
E 星期中的天数 Text Tuesday; Tue
a Am/pm 标记 Text PM
H 一天中的小时数(0-23) Number 0
k 一天中的小时数(1-24) Number 24
K am/pm 中的小时数(0-11) Number 0
h am/pm 中的小时数(1-12) Number 12
m 小时中的分钟数 Number 30
s 分钟中的秒数 Number 55
S 毫秒数 Number 978
z 时区 General time zone Pacific Standard Time; PST; GMT-08:00
Z 时区 RFC 822 time zone -0800
[注意]在开发中,如果使用年月日,用NSDateFormatter setFormat :@"yyyy-MM-dd",如果是使用小时和分钟,设置为:"HH:mm",切记不要设置“HH-mm”,这样会出错的。
举例:
//创建一个时间对象
NSData * date = [NSDate date];
//打印时间
NSLog(@"today is %@",date);
//再获取的时间date减去24小时的时间(昨天的这个时候)
NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow:-(24*60*60)];
NSLog(@"yesterday is %@",yesterday);//打印昨天的时间
/*字符串换成时间*/
//设置一个字符串的时间
NSString *datestring = [NSString stringWithFormat:@"1999-09-03"];
//想要设置自己想要的格式,可以用nsdateformatter这个类,这里是初始化
NSDateFormatter * dm = [[NSDateFormatter alloc]init];
//指定输出的格式 这里格式必须是和上面定义字符串的格式相同,否则输出空
[dm setDateFormat:@"yyyy-MM-dd"];
//把字符串的时间转换成Date对象,用dateFromString方法
NSDate * newdate = [dm dateFromString:datestring];
//输出
NSLog(@"newdate is %@",newdate);
/*把时间转换成字符串*/
//把Date对象转换成String对象 用stringFromDate方法
NSString * datestring2 = [dm stringFromDate:newdate];
//打印
NSLog(@"datestring2 is %@",datestring2);
3,如果使用 UTTabviewCell,设置其accessory样式为:Detail Disclosure ,就是在每一个cell右边设置一个detail button。如果这样的操作是使用storyboard,进行的,它会要求你给每一个你cell设置indentifier,然后你会在以下方法内设置重用indentfier,别忘记加上一句话,否则编译运行时可能会弹出: cell未实例化
4,在开发项目中,有时有这样的需求:运行程序,登陆界面是一个自由的ViewController,只是摆放几个TextField和button,点击后跳转到孩子选择或其它选择界面,点击选项后进入我们的主界面:这个时候,在登陆界面作跳转时,会有好多的方法,如果使用storyboard,就比较方便了,设置一个segue,跳转代码中:
[self PerformSegueWithIdentifier:@"targetViewController",self]; 就可以了,可是我想实例化想要跳转的控制器,然后设置某一属性的值,这样跳转后控制器获取那个属性,就会得到值了,可是这样做会有一个问题:
主界面控制器如果使用了navigatorViewController,并且是其RootViewController,等到在主界面设置功能,点击某一功能,想push到一个新页面时,问题就来了,你会发现毫无反应,没有报错,只是segue无法跳转。后来终于找到原因:就是我在登陆控制器跳转时没有使用segue的方法,而是用代码self.storyboard,加载一个新类,具体原理目前还没有搞明白,先把出问题的代码记录下来,回头补之:
代码这样做,会导致其后无法使用navigatorViewController做push跳转
5,(1010更新)开发过程中,我们通过http请求,后台返回json数据,而有时数据里某一字段的值为null~,然后我们把此值赋值给NSArray,NSdictionary,或是NSString,然后我们会判断此值为null时,所做的处理,而通常惯性思维判断时我们都会写:if(dict == nil)或是if(dict == Nil)或是if(dict == NULL)再或是if(dict isEqual nil),我们发现,都不好用,根本没有起到判断的作用~后来我才发现,原来不能这样来判断。
简单点说,就是当字典,数组为null时,后台打印的输出结果是这样:
然后,我们需要在代码判断时利用[NSNull null]来判断,具体如:
isEqual:[NSNull null] 就搞定了,nsarray也是同样的道理。
控制台打印:str=(null) 代表着 字符串或数组或字典是一个空指针,(而非空字符串)判断的时候,直接用:
if(str == nil)就可以了。如下图所示:
而控制台打印:str = <null>,代表着这是一个空字符串,赋值为空,指针是存在的,只是内容为空,这种判断需要使用:
if(str is equal [NSNull null ]) ,因为在ios上,内容为空不能简单的判断str==null(null 在ios上得用[NSNull null])
一般这种情况是,服务器那边是null,直接返回@"null"的字符串,这样在ios这边不好判断,最好跟后台沟通,如果遇到null值,返回@"",好做判断
6,给uiview设置圆角样式
只需在加载时,添加这样的话就可以了:
testView.layer.cornerRadius = 6;
testView.layer.masksToBounds = YES;
注意,需要 import <QuartzCore/QuartzCore.h> 导入,否则,不能识别cornerRadius和masksToBounds。
uiview设置背景图片:
[theMainView setBackgroundColor: [UIColor colorWithPatternImage: [UIImage imageNamed: @"bg.png"]]];
imageName 缓存,下面方法不缓存
NSString *thePath = [[NSBundle mainBundle] pathForResource:@"default" ofType:@"jpeg"];
UIImage *prodImg = [[UIImage alloc] initWithContentsOfFile:thePath"];
controller.proctImg.image = prodImg;
[prodImg release];
7,隐藏键盘的两种方法
1-1Did End On Exit 调用下面事件当点击键盘return得时候就会隐藏键盘
- (IBAction)textFieldShouldReturn:(UITextField *)textField {
//[sender resignFirstResponder];
if (textField == chi) {
[chi resignFirstResponder];
double m=[chi.textdoubleValue]/3.003;
double f=m *3.2808;
meter.text=[[NSStringalloc] initWithFormat:@"%.4f",m];
feet.text=[[NSStringalloc] initWithFormat:@"%.4f",f];
}
if (textField == meter) {
[meter resignFirstResponder];
}
if (textField == feet) {
[feet resignFirstResponder];
}
}
1-2 点击屏幕得时候隐藏键盘
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch=[[event allTouches] anyObject];
if (touch.tapCount >=1) {
[chi resignFirstResponder];
[meter resignFirstResponder];
[feet resignFirstResponder];
}
}
1-2的方法相当于屏幕任何位置的点击事件(除了各组件的点击处)可以在这个方法里执行要隐藏或remove的view。
8,UITextField密文显示输入内容:
只需要在TextField属性中的Secure(安全的)勾选上就可以了。显示apple默认的密文显示方式。
9,通过系统自带的NSPredicate使用正则表达式。(在TextField中)
NSString *regex =[NSString stringWithFormat:@"^1(3[4-9]|5[012789]|8[2378]|47)\\d{8}$"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
BOOL isMatch = [predicate evaluateWithObject:editPhoneField.text];
10,项目设置应用程序显示名称:
1,在项目的Supporting Files下寻找infoPlist.strings文件,打开后会看到一片空白(英文默认是跟随项目名称显示)。此时,可以就地添加一句代码:CFBundleDisplayName="爱贝通";
这样的话,无论手机设置英文语言还是中文语言,应用程序都会显示设置的名称。
2,为了国际化而言,我们最好创建一个chinese专有的infoPlist.strings文件。
如上图所示,添加一个中文的plist
然后打开添加代码:
这个时候,大功告成。部署在模拟器或真机中吧,你的手机设置(中/英)文语言,它就会调用相应的配置文件。
㈦ 求教一个关于CoreData里NSPredicate的用法问题
NSDate *endDate = [NSDate date];
NSTimeInterval timeInterval= [endDate ];
timeInterval -=3600*24;
NSDate *beginDate = [NSDate :timeInterval];
//过期袭的日期
NSPredicate *predicate_date =
[NSPredicate predicateWithFormat:@"date <= %@", beginDate];
[fetchRequest setPredicate:predicate_date];
㈧ NSPredicate 具有多个条件
很高兴抄告诉你!
通过你的诉说,其实袭作为傍观者,根本就没看到你们复合之后的爱。很明显你们这次是跟金扯上关系了。一个男人,不说养着自己的女友,反而总是要。说句不好听的,对方不会把你当摇树呢吧!而且每次都是你找他,在他的心里你离不开他。你说你还喜欢他,但是有时有些事是不会有结果的。这样的他你都喜欢,但是他是真心喜欢你的吗要过年了,新年新气象 未尝不是一个好的选择。(仅供参考)
为你解除疑惑是我的快乐!
㈨ NSPredicate 具有多个条件
//找出来一源个数组 NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *defaultPath = [[NSBundle mainBundle] resourcePath]; NSError *error; NSArray *directoryContents = [fileManager contentsOfDirectoryAtPath:defau。