简介
KVC(Key-value coding)键值编码,顾名思义。额,简单来讲,是能够经过对象属性名称(Key)直接给属性值(value)编码(coding)“编码”能够理解为“赋值”
。这样能够免去咱们调用getter和setter方法,从而简化咱们的代码,也能够用来修改系统控件内部属性(这个黑魔法且用且珍惜
)。面试
CYXModel
类与CYXShopModel
类,CYXModel
里面有name
、product
属性,CYXShopModel
里面有productName
属性。@interface CYXModel: NSObject @property (nonatomic, strong) NSString *name; @property (nonatomic, strong) CYXShopModel *product; @end
@interface CYXShopModel: NSObject @property (nonatomic, strong) NSString * productName; @end
CYXModel
的属性
CYXModel *model = [[CYXModel alloc]init]; NSString *name = model. name; CYXShopModel *shop = model. product; NSString *productName = shop. productName;
CYXModel *model = [[CYXModel alloc]init]; model. name = @"CYX"; CYXShopModel *shopModel = [[CYXShopModel alloc]init]; shopModel. productName = @"NIKE"; model. product = shopModel;
CYXModel
的属性CYXModel *model = [[CYXModel alloc]init]; NSString *name = [model valueForKey: @"name" ]; NSString *productName = [model valueForKeyPath: @"product.productName" ];
CYXModel *model = [[CYXModel alloc]init]; [model setValue:@"CYX" forKey:@"name"]; [model setValue:@"NIKE" forKeyPath:@"product.productName"];
注: 这个简单的例子,可能你看了以为这并没什么卵用,下面咱们来分析一下稍微有点卵用的例子吧。ide
假设dict字典中有name,icon的Key,CYXModel模型类中必需要有同名的name,icon属性与之相对应。学习
咱们使用[CYXModel setValuesForKeysWithDictionary:dict];
进行字典转模型。ui
setValuesForKeysWithDictionary:
方法内部实现原理以下:编码
// enumerateKeysAndObjectsUsingBlock:遍历字典中的全部keys和valus [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { // 利用KVC给模型中属性赋值,, // key:用来给哪一个属性 // Value:给模型的值 [CYXModel setValue:obj forKey:key]; }];
[CYXModel setValue:dict[@"name"] forKey:@"name"];
[CYXModel setValue:dict[@"icon"] forKey:@"icon"];
setValue:forKey:
方法:给模型的属性赋值atom
setIcon
方法,就直接调用这个set方法,给模型这个属性赋值[self setIcon:dict[@"icon"]];
icon
属性,若是有,就直接访问模型中icon = dict[@"icon"];
_icon
属性,若是有,直接_icon = dict[@"icon"];
[<Flag 0x7fb74bc7a2c0> setValue:forUndefinedKey:]
扩展:读者能够去查查KVV(键值验证),进一步理解报错缘由与容错方法。设计
做为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个个人iOS交流群:519832104 无论你是小白仍是大牛欢迎入驻,分享经验,讨论技术,你们一块儿交流学习成长!code
另附上一份各好友收集的大厂面试题,须要iOS开发学习资料、面试真题,能够添加iOS开发进阶交流群,进群可自行下载!对象
有时候,UI会闲着没事,会给你找点事情,例如,界面设计图是这样的:图片
这。。怎么感受有点不一样,这UIPageControl
怎么跟我日常用的不同?日常不都是这样的??以下图
首先想到的确定是,查看UIPageControl
的头文件,以下:
NS_CLASS_AVAILABLE_IOS(2_0) @interface UIPageControl : UIControl @property(nonatomic) NSInteger numberOfPages; // default is 0 @property(nonatomic) NSInteger currentPage; // default is 0\. value pinned to 0..numberOfPages-1 @property(nonatomic) BOOL hidesForSinglePage; // hide the the indicator if there is only one page. default is NO @property(nonatomic) BOOL defersCurrentPageDisplay; // if set, clicking to a new page won't update the currently displayed page until -updateCurrentPageDisplay is called. default is NO - (void)updateCurrentPageDisplay; // update page display to match the currentPage. ignored if defersCurrentPageDisplay is NO. setting the page value directly will update immediately - (CGSize)sizeForNumberOfPages:(NSInteger)pageCount; // returns minimum size required to display dots for given page count. can be used to size control if page count could change @property(nullable, nonatomic,strong) UIColor *pageIndicatorTintColor NS_AVAILABLE_IOS(6_0) UI_APPEARANCE_SELECTOR; @property(nullable, nonatomic,strong) UIColor *currentPageIndicatorTintColor NS_AVAILABLE_IOS(6_0) UI_APPEARANCE_SELECTOR; @end
UIImage
对象的属性?看来正常途径使用系统的控件是设不了了,剩下的我感受只有两种方法(若有其它,欢迎指出),一种是自定义PageControl
,这种方式看起来不简单,各位有兴趣能够去试试。另外一种方式就是,经过runtime遍历出UIPageControl
全部属性(包括私有成员属性,runtime确实很强大)。UIPageControl
结果(下篇文字再谈谈runtime,这里暂不解释)以下打印:2016-03-23 01:09:26.161 TenMinDemo[6224:507269] UIPageControl -> _lastUserInterfaceIdiom = q 2016-03-23 01:09:26.161 TenMinDemo[6224:507269] UIPageControl -> _indicators = @"NSMutableArray" 2016-03-23 01:09:26.161 TenMinDemo[6224:507269] UIPageControl -> _currentPage = q 2016-03-23 01:09:26.161 TenMinDemo[6224:507269] UIPageControl -> _displayedPage = q 2016-03-23 01:09:26.162 TenMinDemo[6224:507269] UIPageControl -> _pageControlFlags = {?="hideForSinglePage"b1"defersCurrentPageDisplay"b1} 2016-03-23 01:09:26.162 TenMinDemo[6224:507269] UIPageControl -> _currentPageImage = @"UIImage" // 当前选中图片 2016-03-23 01:09:26.162 TenMinDemo[6224:507269] UIPageControl -> _pageImage = @"UIImage" // 默认图片 2016-03-23 01:09:26.162 TenMinDemo[6224:507269] UIPageControl -> _currentPageImages = @"NSMutableArray" 2016-03-23 01:09:26.162 TenMinDemo[6224:507269] UIPageControl -> _pageImages = @"NSMutableArray" 2016-03-23 01:09:26.162 TenMinDemo[6224:507269] UIPageControl -> _backgroundVisualEffectView = @"UIVisualEffectView" 2016-03-23 01:09:26.162 TenMinDemo[6224:507269] UIPageControl -> _currentPageIndicatorTintColor = @"UIColor" 2016-03-23 01:09:26.163 TenMinDemo[6224:507269] UIPageControl -> _pageIndicatorTintColor = @"UIColor" 2016-03-23 01:09:26.163 TenMinDemo[6224:507269] UIPageControl -> _legibilitySettings = @"_UILegibilitySettings" 2016-03-23 01:09:26.163 TenMinDemo[6224:507269] UIPageControl -> _numberOfPages = q
UIPageControl *pageControl = [[UIPageControl alloc] init]; [pageControl setValue:[UIImage imageNamed:@"home_slipt_nor"] forKeyPath:@"_pageImage"]; [pageControl setValue:[UIImage imageNamed:@"home_slipt_pre"] forKeyPath:@"_currentPageImage"];
这里只是抛砖引玉的讲了个小例子,其余的神奇功能等待读者去发现啦。
提示: 在xib/Storyboard中,也可使用KVC,下面是在xib中使用KVC把图片边框设置成圆角