首页 文章 精选 留言 我的

精选列表

搜索[ios],共10000篇文章
优秀的个人博客,低调大师

iOS打电话

打电话 1,这种方法,拨打完电话回不到原来的应用,会停留在通讯录里,而且是直接拨打,不弹出提示NSMutableString* str=[[NSMutableStringalloc]initWithFormat:@"tel:%@",@"186xxxx9999"]; // NSLog(@"str======%@",str);[[UIApplication sharedApplication] openURL:[NSURL URLWithString:str]]; 2,这种方法,打完电话后还会回到原来的程序,也会弹出提示,推荐这种NSMutableString* str=[[NSMutableStringalloc]initWithFormat:@"tel:%@",@"186xxxx9999"]; UIWebView* callWebview = [[UIWebViewalloc]init]; [callWebviewloadRequest:[NSURLRequestrequestWithURL:[NSURLURLWithString:str]]]; [self.viewaddSubview:callWebview]; [callWebviewrelease]; [strrelease];3,这种方法也会回去到原来的程序里(注意这里的telprompt),也会弹出提示NSMutableString* str=[[NSMutableStringalloc]initWithFormat:@"telprompt://%@",@"186xxxx9999"]; // NSLog(@"str======%@",str); [[UIApplicationsharedApplication]openURL:[NSURLURLWithString:str]] 本文转自 卓行天下 51CTO博客,原文链接:http://blog.51cto.com/9951038/1745928,如需转载请自行联系原作者

优秀的个人博客,低调大师

IOS Socket编程

iphone的标准推荐CFNetwork C库编程.但是编程比较烦躁。在其它OS往往用类来封装的对Socket函数的处理。比如MFC的CAsysncSocket.在iphone也有类似于开源项目.cocoa AsyncSocket库,官方网站:http://code.google.com/p/cocoaasyncsocket/它用来简化CFnetwork的调用. 一.在项目引入ASyncSocket库 1.下载ASyncSocket库源码 2.把ASyncSocket库源码加入项目:只需要增加RunLoop目录中的AsyncSocket.h、AsyncSocket.m、AsyncUdpSocket.h和AsyncUdpSocket.m四个文件。 3.在项目增加CFNetwork框架 在Framework目录右健,选择Add-->Existing Files... , 选择CFNetwork.framework 二.TCP客户端 1. 在controller头文件定义AsyncSocket对象 #import <UIKit/UIKit.h> #import "AsyncSocket.h" @interface HelloiPhoneViewController : UIViewController { UITextField * textField; AsyncSocket * asyncSocket; } @property (retain, nonatomic) IBOutlet UITextField *textField; - (IBAction) buttonPressed: (id)sender; - (IBAction) textFieldDoneEditing: (id)sender; @end 2.在需要联接地方使用connectToHost联接服务器 其中initWithDelegate的参数中self是必须。这个对象指针中的各个Socket响应的函数将被ASyncSocket所调用. asyncSocket = [[AsyncSocket alloc] initWithDelegate:self]; NSError *err = nil; if(![asyncSocket connectToHost:host on:port error:&err]) { NSLog(@"Error: %@", err); } 3.增加Socket响应事件 因为initWithDelegate把将当前对象传递进去,这样只要在当前对象方法实现相应方法. 4.关于NSData对象 无论SOCKET收发都采用NSData对象.它的定义是http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/Reference/Reference.html NSData主要是带一个(id)data指向的数据空间和长度 length. NSString 转换成NSData 对象 NSData* xmlData = [@"testdata" dataUsingEncoding:NSUTF8StringEncoding]; NSData 转换成NSString对象 NSData * data; NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 4.发送数据 AsyncSocket writeData 方法来发送数据,它有如下定义 - (void)writeData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag; 以下是一个实例语句. NSData* aData= [@"test data" dataUsingEncoding: NSUTF8StringEncoding]; [sock writeData:aData withTimeout:-1 tag:1]; 在onSocket重载函数,有如定义采用是专门用来处理SOCKET的发送数据的: -(void)onSocket(AsyncSocket *)sock didWriteDataWithTag:(long)tag { NSLog(@"thread(%),onSocket:%p didWriteDataWithTag:%d",[[NSThread currentThread] name], sock,tag); } 5.接收Socket数据. 在onSocket重载函数,有如定义采用是专门用来处理SOCKET的接收数据的. -(void) onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 在中间将其转换成NSString进行显示. NSString* aStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"===%@",aStr); [aStr release]; 本文转蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366439,如需转载请自行联系原作者

优秀的个人博客,低调大师

IOS面试宝典

Object-C有多继承吗?没有的话用什么代替? cocoa 中所有的类都是NSObject 的子类,多继承在这里是用protocol 委托代理来实现的 你不用去考虑繁琐的多继承 ,虚基类的概念.ood的多态特性 在 obj-c 中通过委托来实现. Object-C有私有方法吗?私有变量呢? objective-c– 类里面的方法只有两种, 静态方法和实例方法. 这似乎就不是完整的面向对象了,按照OO的原则就是一个对象只暴露有用的东西. 如果没有了私有方法的话, 对于一些小范围的代码重用就不那么顺手了. 在类里面声名一个私有方法 @interface Controller : NSObject { NSString *something; } + (void)thisIsAStaticMethod; – (void)thisIsAnInstanceMethod; @end @interface Controller (private) - (void)thisIsAPrivateMethod; @end @private可以用来修饰私有变量 在Objective‐C中,所有实例变量默认都是私有的,所有实例方法默认都是公有的 关键字const什么含义 const意味着”只读”,下面的声明都是什么意思? const int a; int const a; const int *a; int * const a; int const * a const; 前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。 结论: 本文转自蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366597,如需转载请自行联系原作者

优秀的个人博客,低调大师

IOS开发-KVO

一、什么是kvo? key-value observing,观察者模式 观察者,观察对象属性的变化,当被观察者该属性发生变化时,观察者会接收到通知,可以在回调函数中做相应的处理 二、有什么作用? 变化处理操作可以在同一个函数中进行,先前本人都会在每次修改属性值的地方调用后续操作,比较繁琐,修改的地方也比较多,现在只要在同一个函数中操作就可以 用kvo只要做监控就行,更加方便易用,减少代码逻辑 三、使用场景: 当一个控件某个属性变化需要做别的相应操作时,比较适合用kvo,只要当该属性发生变化时,会发消息给观察者,在回调函数中做相应的操作 四、实际例子: 一)解释方法: typedef NS_OPTIONS(NSUInteger, NSKeyValueObservingOptions) { NSKeyValueObservingOptionNew = 0x01,//改变后的值 NSKeyValueObservingOptionOld = 0x02,//改变前的值 NSKeyValueObservingOptionInitial NS_ENUM_AVAILABLE(10_5, 2_0) = 0x04, //addobserving之后会马上调用observeValueForKeyPath,不会等到值改变 NSKeyValueObservingOptionPrior NS_ENUM_AVAILABLE(10_5, 2_0) = 0x08 //分2次调用。在值改变之前和值改变之后 }; NSKeyValueObservingOptionNew =0x01,//改变后的值NSKeyValueObservingOptionOld =0x02,//改变前的值这两个用到的比较多 NSObject(NSKeyValueObserving) //一旦被观察者属性发生改变,就会调用此方法后续操作在这个方法中进行 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context; keyPath:是被观察对象的属性,字符串表示 object:被观察对象 change:属性改变的值,字典,通过objectForKey (key为 FOUNDATION_EXPORTNSString*constNSKeyValueChangeKindKey; FOUNDATION_EXPORTNSString*constNSKeyValueChangeNewKey; FOUNDATION_EXPORTNSString*constNSKeyValueChangeOldKey; FOUNDATION_EXPORTNSString*constNSKeyValueChangeIndexesKey; FOUNDATION_EXPORTNSString*constNSKeyValueChangeNotificationIsPriorKeyNS_AVAILABLE(10_5,2_0); 对应addobserving指定的NSKeyValueObservingOptions ) context:需要传输的数据(void *:任意指针类型),一般传(__bridgevoid*)self 或者 nil,用户也能传别的 for example: - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (context == (__bridge void*)self) { if ([keyPath isEqualToString:kKeyPathForNavigationItemRightBarButtonItems]) { //取值 NSArray *rightBarButtonItems = [change objectForKey:NSKeyValueChangeNewKey]; //需要做操作 self.navigationItem.rightBarButtonItems = rightBarButtonItems; } } else { [super observeValueForKeyPath:keyPath ofObject:objectchange:changecontext:context]; } } -------------------------------------------- 二)接口方法 NSObject(NSKeyValueObserverRegistration) - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context; - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(void *)context NS_AVAILABLE(10_7, 5_0); - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath; NSArray(NSKeyValueObserverRegistration) - (void)addObserver:(NSObject *)observer toObjectsAtIndexes:(NSIndexSet *)indexes forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context; - (void)removeObserver:(NSObject *)observer fromObjectsAtIndexes:(NSIndexSet *)indexes forKeyPath:(NSString *)keyPath context:(void *)contextNS_AVAILABLE(10_7,5_0); - (void)removeObserver:(NSObject *)observer fromObjectsAtIndexes:(NSIndexSet *)indexes forKeyPath:(NSString *)keyPath; - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context; - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(void *)context NS_AVAILABLE(10_7, 5_0); - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath; NSOrderedSet(NSKeyValueObserverRegistration) - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context; - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(void *)context NS_AVAILABLE(10_7, 5_0); - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath; NSSet(NSKeyValueObserverRegistration) - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context; - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(void *)context NS_AVAILABLE(10_7, 5_0); - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath; NSObject(NSKeyValueObserverNotification) //这些方法都为了手动通知用到 - (void)willChangeValueForKey:(NSString *)key; - (void)didChangeValueForKey:(NSString *)key; - (void)willChange:(NSKeyValueChange)changeKind valuesAtIndexes:(NSIndexSet *)indexes forKey:(NSString *)key; - (void)didChange:(NSKeyValueChange)changeKind valuesAtIndexes:(NSIndexSet *)indexes forKey:(NSString *)key; - (void)willChangeValueForKey:(NSString *)key withSetMutation:(NSKeyValueSetMutationKind)mutationKind usingObjects:(NSSet *)objects; - (void)didChangeValueForKey:(NSString *)key withSetMutation:(NSKeyValueSetMutationKind)mutationKind usingObjects:(NSSet *)objects; NSObject(NSKeyValueObservingCustomization) + (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)keyNS_AVAILABLE(10_5,2_0); + (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key; **addObserver和removeObserver要成对出现 ----------------------------------------------------------------------- **手动通知: 有两种通知观察者的方式,自动通知和手动通知。顾名思义,手动通知需要在值变化时调用 willChangeValueForKey:和didChangeValueForKey: 方法通知调用者。为求简便,我们一般使用自动通知。 要使用手动通知,需要在 automaticallyNotifiesObserversForKey方法中明确告诉cocoa,哪些键值要使用手动通知: forExample: [self willChangeValueForKey:@"frame"]; self.frame = CGRectMake(0,0,320,100); [self didChangeValueForKey:@"frame"]; 这时候就会调用 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context; //重新实现NSObject类中的automaticallyNotifiesObserversForKey:方法,返回yes表示自动通知。 + (BOOL)automaticallyNotifiesObserversForKey:(NSString*)key { //当这两个值改变时,使用自动通知已注册过的观察者,观察者需要实现observeValueForKeyPath:ofObject:change:context:方法 if ([key isEqualToString:@"frame"]) { return NO; } return [super automaticallyNotifiesObserversForKey:key]; } 这时候frame就必须要手动通知 *手动通知一般不用,为了方便,都自动通知,所以这部分知道就可以了 ----------------------------------------------------------------------- 上面一些接口方法说明NSObject,NSArray,NSSet均实现了以上方法,因此我们不仅可以观察普通对象,还可以观察数组或结合类对象。 一般用的都是观察NSObject的某个属性 对NSArray进行观察是观察NSArray中每个model的属性 NSSet和NSArray差不多,只不过NSSet是无序集合 本文转自 咖啡机(K.F.J) 博客园博客,原文链接:http://www.cnblogs.com/strick/p/4036663.html ,如需转载请自行联系原作者

优秀的个人博客,低调大师

iOS小方法

1.取字符串中的某段字符串[plain] view plaincopyprint? NSString *str=@"12sadfsdf56afsdf"; NSLog(@"%@",str); NSString *thrStr = [strstringByReplacingOccurrencesOfString:@"56"withString:@"88"]; NSLog(@"%@",thrStr); 即把12sadfsdf56afsdf中的56替换为88,替换后字符串为:12sadfsdf88afsdf 2.简单plist获取 [plain] view plaincopyprint? NSString *path = [[NSBundlemainBundle]pathForResource:@"Array"ofType:@"plist"]; NSMutableDictionary *data = [[NSMutableDictionaryalloc]initWithContentsOfFile:path]; NSLog(@"%d",[datacount]); NSLog(@"%@",[dataallValues]); NSLog(@"------------") ; NSArray *ary = [dataallKeys]; NSLog(@"%d",[arycount]); NSArray *array = [NSArrayarrayWithArray:ary]; for(int i=0;i<[arraycount];i++) { NSLog(@"\n value = %@",[arrayobjectAtIndex:i]); } NSArray *getArray = [[dataallValues]objectAtIndex:5]; NSLog(@"get_array:%@",getArray); 3.状态栏和UINavigationBar设置成透明 [[UIApplicationsharedApplication]setStatusBarStyle:UIStatusBarStyleBlackTranslucent];//状态栏设置为透明 theNavigationController.navigationBar.barStyle =UIBarStyleBlackTranslucent;//设置navigationBar为透明 4.设置object圆角,如UIView、UIImageView等 简单几步: 一.导入QuartzCore.framework框架#import 二.object.layer.masksToBounds=YES; 三.object.layer.cornerRadius=XXX; [plain] view plaincopyprint? UIImageView *testImageView = [[UIImageViewalloc]initWithImage:[UIImageimageNamed:@"1.jpg"]]; [testImageViewsetFrame:CGRectMake(20,20,100,100)]; testImageView.layer.masksToBounds =YES; testImageView.layer.cornerRadius =50/2;//设置的角度,改变查看效果 testImageView.layer.borderWidth =5;//边框宽度 testImageView.layer.borderColor = [UIColoryellowColor].CGColor;//边框颜色 [self.viewaddSubview:testImageView]; [testImageViewrelease]; 5.程序是启动状态时设置屏幕一直亮 UIApplication *appDelegate = [UIApplicationsharedApplication]; appDelegate.idleTimerDisabled =YES; 6.设置UITableViewCell显示子标题初始化时:cell = [[UITableViewCellalloc]initWithStyle:UITableViewCellStyleSubtitlereuseIdentifier:CellIdentifier]; 此处样式应注意,即设置为显示子标题样式,默认样式为不显示子标题,设置完后可用: cell.detailTextLabel.text =@"详细标签";设置子标题 7.给UIView设置阴影效果 [plain] view plaincopyprint? UIView *showView = [[UIViewalloc]initWithFrame:CGRectMake(10,150,100,100)]; showView.backgroundColor = [UIColorredColor]; showView.layer.shadowOffset =CGSizeMake(15,5); showView.layer.shadowOpacity =0.6; showView.layer.shadowColor = [UIColorblackColor].CGColor; [self.viewaddSubview:showView]; [showViewrelease]; 8.设置UITableView选中行数的位置 [self.tableViewselectRowAtIndexPath:[NSIndexPathindexPathForRow:5inSection:0]animated:NOscrollPosition:UITableViewScrollPositionMiddle]; //selectRowAtIndexPath设置行数和sectionscrollPosition设置滚动到的位置(4项可供选择) 9.UITextField每次操作调用的代理,可根据需求作相应改变- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSMutableString *newString = [[textField.textmutableCopy]autorelease]; [newStringreplaceCharactersInRange:rangewithString:string];//得到改变的字符串 } 10.如何用UIColor生成UIImage [plain] view plaincopyprint? - (void)viewDidLoad { [superviewDidLoad]; UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10,10,100,100)]; UIImage *image = [self createImageWithColor:[UIColoryellowColor]];//生成一张黄颜色的图片 [imageViewsetImage:image]; [self.viewaddSubview:imageView]; [imageViewrelease]; } - (UIImage *) createImageWithColor: (UIColor *) color { CGRect rect = CGRectMake(0.0f,0.0f,1.0f,1.0f); UIGraphicsBeginImageContext(rect.size); CGContextRef context =UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, [colorCGColor]); CGContextFillRect(context, rect); UIImage *theImage =UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return theImage; } 本文转自 卓行天下 51CTO博客,原文链接:http://blog.51cto.com/9951038/1827817,如需转载请自行联系原作者

优秀的个人博客,低调大师

ios--plist

// // main.m // 03-plist文件的回顾 // // Created by xiaomage on 15/12/29. // Copyright © 2015年 小码哥. All rights reserved. // #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { // 数组 NSArray *names1 = @[@"yjh", @"gxq", @"mj", @"nj"]; BOOL flag1 = [names1 writeToFile:@"/test.plist" atomically:YES]; NSDictionary *persons2 = @{ @"name" : @"yjh", @"age" : @18, @"height" : @1.88 }; BOOL flag2 = [persons2 writeToFile:@"/Users/mctc/Desktop/a.plist" atomically:YES]; NSArray *persons3 = @[ @{@"name" : @"mj", @"age":@38}, @{@"name" : @"yjh", @"age":@25, @"friends":@[@"大神11期", @"sz"]} ]; BOOL flag3 = [persons3 writeToFile:@"/Users/mctc/Desktop/a.plist" atomically:YES]; if (flag3) { NSLog(@"写入成功!"); } NSArray *dataArr4 = @[ @{@"name":@"单肩包", @"icon":@"danjianbao"}, @{@"name":@"钱包", @"icon":@"qianbao"}, @{@"name":@"链条包", @"icon":@"liantiaobao"}, @{@"name":@"手提包", @"icon":@"shoutibao"}, @{@"name":@"双肩包", @"icon":@"shuangjianbao"}, @{@"name":@"斜挎包", @"icon":@"xiekuabao"} ]; BOOL flag4 = [dataArr4 writeToFile:@"/Users/mctc/Desktop/a.plist" atomically:YES]; if (flag4) { NSLog(@"写入成功!"); } NSArray *persons5 = [NSArray arrayWithContentsOfFile:@"/Users/mctc/Desktop/a.plist"]; NSLog(@"%@", persons5); /* ( { icon = danjianbao; name = "\U5355\U80a9\U5305"; }, { icon = qianbao; name = "\U94b1\U5305"; }, { icon = liantiaobao; name = "\U94fe\U6761\U5305"; }, { icon = shoutibao; name = "\U624b\U63d0\U5305"; }, { icon = shuangjianbao; name = "\U53cc\U80a9\U5305"; }, { icon = xiekuabao; name = "\U659c\U630e\U5305"; } ) */ } return 0; } 本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/7449649.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

iOS textview排版

- (IBAction)changeText:(id)sender { NSMutableParagraphStyle*paragraphStyle = [[NSMutableParagraphStylealloc]init]; paragraphStyle.alignment=NSTextAlignmentCenter; paragraphStyle.paragraphSpacing=12.0f; NSMutableDictionary*attributes = [NSMutableDictionarydictionary]; attributes[NSParagraphStyleAttributeName] = paragraphStyle; attributes[NSFontAttributeName] = [UIFontfontWithName:@"Futura"size:20.0f]; attributes[NSForegroundColorAttributeName] = [UIColorcolorWithRed:1.0fgreen:0blue:0alpha:1.0f]; NSAttributedString*attriStr = [[NSAttributedStringalloc]initWithString:self.mytextView.textattributes:attributes]; self.mytextView.attributedText= attriStr; } 本文转自 卓行天下 51CTO博客,原文链接:http://blog.51cto.com/9951038/1772574,如需转载请自行联系原作者

优秀的个人博客,低调大师

iOS开发-NSPredicate

Cocoa中谓词(Predicate)提供了一个通用的查询方式处理数据,可以获取和指定数据的过滤形式,Cocoa实际开发中可以是使用NSPredicate及其父类NSComparisonPredicate和NSCompoundPredicate.其风格类似于SQL查询语言和正则表达式的混合体,提供了具有表现力的,自然语言界面来定义一个集合被搜寻的逻辑条件。一般来说稍微操作过数据库基本上很容易理解其中的方法,至于使用的方法也很简单。 集合中的NSPredicate Foundation提供使用谓词(predicate)来过滤NSArray/NSMutableArray&NSSet/NSMutableSet的方法。 不可变的集合,NSArray&NSSet,可以通过评估接收到的predicate来返回一个不可变集合的方法filteredArrayUsingPredicate和filteredSetUsingPredicate; 可变集合,NSMutableArray&NSMutableSet,可以使用方法filterUsingPredicate:可以通过运行接收到的谓词来移除评估结果为FALSE的对象。 首先来一段比较简单的代码: 1 2 3 4 NSPredicate *predicate = [ NSPredicate predicateWithFormat:@ "SELF IN %@" , @[@ "keso" , @ "FlyElephant" , @ "博客园" ]]; if ([predicate evaluateWithObject:@ "keso" ]) { NSLog (@ "keso" ); }; 第一行代码初始化一个查询条件,第二句就是判断数据在不在结果集中,跟SQL基本上一样,通过IN就能大概了解其功能,SELF表示本身,非常常用。 接下来可以类似于SQL中like语句的代码: 1 2 3 4 5 6 NSArray *array = [[ NSArray alloc]initWithObjects:@ "北京" ,@ "上海" ,@ "广州" ,@ "深圳" , nil ]; NSPredicate *preBegin= [ NSPredicate predicateWithFormat:@ "SELF beginswith[c] %@" ,@ "北" ]; NSPredicate *preContain= [ NSPredicate predicateWithFormat:@ "SELF contains[c] %@" ,@ "海" ]; NSLog (@ "%@" ,[array filteredArrayUsingPredicate:preBegin][0]); NSLog (@ "%@" ,[array filteredArrayUsingPredicate:preContain][0]); 第一次就是先初始化数组,然后创建条件,通过filteredArrayUsingPredicate过滤数组; NSDictionary可以用谓词来过滤它的键和值(两者都为NSArray对象); NSOrderedSet可以由过滤的NSArray或NSSet生成一个新的有序的集,或者NSMutableSet可以简单的removeObjectsInArray来传递通过否定predicate过滤的对象。 Core Data中的NSPredicate 谓词的在Core Data同样适用,在管理对象环境中,谓词由持久化存储助理(persistent store coordinator)评估,而集合则是内存中过滤。这时候我们有必要里了解一下基本比较运算符: =, ==:左边的表达式和右边的表达式相等。 >=, =>:左边的表达式大于或者等于右边的表达式。 <=, =<:左边的表达式小于等于右边的表达式。 >:左边的表达式大于右边的表达式。 <:左边的表达式小于右边的表达式。 !=, <>:左边的表达式不等于右边的表达式。 BETWEEN:左边的表达式等于右边的表达式的值或者介于它们之间。右边是一个有两个指定上限和下限的数值的数列(指定顺序的数列)。比如,1 BETWEEN { 0 , 33 },或者INPUTBETWEEN{INPUTBETWEEN{LOWER, $UPPER }。可参考以下代码: 1 2 3 4 5 6 7 8 9 NSPredicate *betweenPredicate = [ NSPredicate predicateWithFormat: @ "attributeName BETWEEN %@" , @[ @1 , @10 ]]; NSDictionary *dictionary = @{ @ "attributeName" : @5 }; BOOL between = [betweenPredicate evaluateWithObject:dictionary]; if (between) { NSLog (@ "比较运算符between" ); } 基本复合谓词 AND, &&:逻辑与. OR, ||:逻辑或. NOT, !:逻辑非 字符串比较 字符串比较非常常用,以下的都应该比较熟悉: BEGINSWITH[cd] $FIRST_NAME。 BEGINSWITH:左边的表达式以右边的表达式作为开始。 CONTAINS:左边的表达式包含右边的表达式。 ENDSWITH:左边的表达式以右边的表达式作为结束。 LIKE:左边的表达式等于右边的表达式:?和*可作为通配符,其中?匹配1个字符,*匹配0个或者多个字符。 MATCHES:左边的表达式根据ICU v3的regex风格比较,等于右边的表达式。 可参考以下代码: 1 2 3 4 5 6 NSString *regex = @ "[A-Za-z]+" ; NSPredicate *matchpredicate = [ NSPredicate predicateWithFormat:@ "SELF MATCHES %@" , regex]; if ([matchpredicate evaluateWithObject:@ "keso" ]) { NSLog (@ "匹配成功" ); } 关系操作 ANY,SOME:指定下列表达式中的任意元素。比如,ANY children.age < 18。 ALL:指定下列表达式中的所有元素。比如,ALL children.age < 18。 NONE:指定下列表达式中没有的元素。比如,NONE children.age < 18。它在逻辑上等于NOT (ANY ...)。 IN:等于SQL的IN操作,左边的表达必须出现在右边指定的集合中。比如,name IN { 'Ben', 'Melissa', 'Nick' }。 数组操作 array[index]:指定数组中特定索引处的元素。 array[FIRST]:指定数组中的第一个元素。 array[LAST]:指定数组中的最后一个元素。 array[SIZE]:指定数组的大小。 布尔值谓词 TRUEPREDICATE:结果始终为真的谓词。 FALSEPREDICATE:结果始终为假的谓词。 下面提供一个简单使用谓词搜索类对象的代码: 新建一个People类,头文件: 1 2 3 4 5 6 7 8 9 10 11 @interface People : NSObject @property (strong, nonatomic ) NSString *FirstName; @property (strong, nonatomic ) NSString *LastName; @property ( nonatomic ) NSInteger Height; - ( NSString *)description; @end People.m文件: 1 2 3 4 5 6 7 @implementation People - ( NSString *)description { return [ NSString stringWithFormat:@ "%@%@" , self .LastName, self .FirstName]; }; @end 具体实现代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 NSArray *firstNames =[[ NSArray alloc]initWithObjects:@ "泽东" , @ "恩来" , @ "介石" , @ "中山" , nil ]; NSArray *lastNames = @[ @ "毛" , @ "周" , @ "蒋" , @ "孙" ]; NSArray *familiar = @[ @100 , @99 , @99 , @98 ]; NSMutableArray *dataList= [ NSMutableArray array]; [firstNames enumerateObjectsUsingBlock:^( id obj, NSUInteger idx, BOOL *stop) { People *people= [[People alloc] init]; people.FirstName = firstNames[idx]; people.LastName = lastNames[idx]; people.Height= [familiar[idx] integerValue]; [dataList addObject:people]; }]; NSPredicate *firstPredicate = [ NSPredicate predicateWithFormat:@ "FirstName = '恩来'" ]; NSPredicate *lastPredicate = [ NSPredicate predicateWithFormat:@ "LastName = %@" , @ "蒋" ]; NSPredicate *heightPredicate = [ NSPredicate predicateWithFormat:@ "Height < 99" ]; //名搜索 NSLog (@ "名: %@" ,[dataList filteredArrayUsingPredicate:firstPredicate][0]); //姓搜索 NSLog (@ "姓: %@" , [dataList filteredArrayUsingPredicate:lastPredicate][0]); //知名度 NSLog (@ "知名度: %@" , [dataList filteredArrayUsingPredicate:heightPredicate][0]); 其实开始讲的NSCompoundPredicate和NSComparisonPredicate,因为有关系操作,基本上类似,如果通过混合搜索可以使用and,or实现,比如一下代码是等价的: 1 2 3 NSCompoundPredicate *comPredicate=[ NSCompoundPredicate andPredicateWithSubpredicates:@[[ NSPredicate predicateWithFormat:@ "Height > 90" ], [ NSPredicate predicateWithFormat:@ "FirstName = %@" , @ "介石" ]]]; NSPredicate *secondPredicate=[ NSPredicate predicateWithFormat:@ "(Height > 90) AND (FirstName = %@)" , @ "介石" ]; NSComparisonPredicate有两个调用的静态方法: 1 2 + ( NSComparisonPredicate *)predicateWithLeftExpression:( NSExpression *)lhs rightExpression:( NSExpression *)rhs modifier:( NSComparisonPredicateModifier )modifier type:( NSPredicateOperatorType )type options:( NSComparisonPredicateOptions )options; + ( NSComparisonPredicate *)predicateWithLeftExpression:( NSExpression *)lhs rightExpression:( NSExpression *)rhs customSelector:( SEL )selector; 其实就是一个表达式的拼接的过程,不过具体的实现苹果给封装好了,一下是NSPredicateOperatorType类型: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 typedef NS_ENUM ( NSUInteger , NSPredicateOperatorType ) { NSLessThanPredicateOperatorType = 0, // compare: returns NSOrderedAscending NSLessThanOrEqualToPredicateOperatorType , // compare: returns NSOrderedAscending || NSOrderedSame NSGreaterThanPredicateOperatorType , // compare: returns NSOrderedDescending NSGreaterThanOrEqualToPredicateOperatorType , // compare: returns NSOrderedDescending || NSOrderedSame NSEqualToPredicateOperatorType , // isEqual: returns true NSNotEqualToPredicateOperatorType , // isEqual: returns false NSMatchesPredicateOperatorType , NSLikePredicateOperatorType , NSBeginsWithPredicateOperatorType , NSEndsWithPredicateOperatorType , NSInPredicateOperatorType , // rhs contains lhs returns true NSCustomSelectorPredicateOperatorType , NSContainsPredicateOperatorType NS_ENUM_AVAILABLE (10_5, 3_0) = 99, // lhs contains rhs returns true NSBetweenPredicateOperatorType NS_ENUM_AVAILABLE (10_5, 3_0) }; 本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4264869.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

IOS开发-KVC

1. 什么是kvc kvc--key-value coding,健值编码 可以通过key直接访问对象属性的value的方法 2.使用场景 kvc主要是为了让代码变的更简介明了 用的比较多的是在后台数据解析,还有访问一些没有setter,getter方法的属性 3.代码解析: 定义都在NSKeyValueCoding.h中 主要两个方法: //key为当前类的属性名 - (id)valueForKey:(NSString *)key; //当类没有名为key的属性时会调用抛出异常,可以复写valueForUndefinedKey:方法,作处理 - (void)setValue:(id)value forKey:(NSString *)key;//当类没有名为key的属性时会调用抛出异常,可以复写- (void)setValue:(id)value forUndefinedKey:(NSString *)key:方法,作处理 //keyPath 为访问属性的路径,比如:@"person.name",person是当前类的属性,name是person类的一个属性名 - (id)valueForKeyPath:(NSString *)keyPath; - (void)setValue:(NSValue *)value forKeyPath:(NSString *)keyPath; 异常处理 - (id)valueForUndefinedKey:(NSString *)key; - (void)setValue:(id)value forUndefinedKey:(NSString *)key 代码举例: @interface ViewController () @property (nonatomic, weak) NSString *viewString; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"----[%@]",[self valueForKey:@"viewString"]); NSLog(@"----[%@]",[self valueForKey:@"viewArray"]); [self setValue:@"testForViewString" forKey:@"viewString"]; [self setValue:@"1" forKey:@"viewArray"]; } - (void)setValue:(id)value forUndefinedKey:(NSString *)key { NSLog(@"【warning】!!!!!!---Undefined--key[%@]--!!!!!!",key); } - (id)valueForUndefinedKey:(NSString *)key { if ([key isEqualToString:@"viewArray"]) { return @"aaaa"; } else { return [super valueForUndefinedKey:key]; } } 实现原理 参考http://www.tuicool.com/articles/M7vQRj 感谢这篇文章,写的很详细 但有个疑问: 虽然说这几个方法一般不会去调用或者用到,但是我尝试了一下,系统并没有调用这些方法,而是直接走到了 - (id)valueForUndefinedKey:(NSString *)key 本文转自 咖啡机(K.F.J) 博客园博客,原文链接:http://www.cnblogs.com/strick/p/4046434.html,如需转载请自行联系原作者

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册