KVC 和KVO的運用
KVC 和KVO 是不經過初試化辦法直接改動實例變量值的一種非正式的protocol
一. KVC —— Key-Value-Coding
鍵值編碼,一種可以直接經過字符串key(對象的屬性)來訪問或修正對象屬性的機制。
在這舉一個例子:
1.創立一個People 類承繼自NSObject
People.h文件:
#import <Foundation/Foundation.h>
@interface People : NSObject
/*
name: 人的屬性(姓名)
age: 人的屬性(年齡)
*/
@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) NSInteger age;
@end
People.h文件:
#import "People.h"
@implementation People
//獲取姓名
- (void)setName:(NSString *)name{
_name = name;
NSLog(@"人的名字:%@",_name);
}
@end
1.創立一個ViewController 類
#import "ViewController.h"
#import "People.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
//創立一個People類的對象
People *people = [[Peoplealloc] init];
//辦法一:常用的辦法給 people的 name屬性賦值
people.name =@"北京歡送您";
//辦法二:KVC辦法給 people的 name屬性賦值
[people setValue:@"京津追夢人"forKey:@"name"];
//辦法三:KVC辦法給 people的 name屬性賦值
[people setValue:@"京津追夢人"forKeyPath:@"name"];
}
@end
/*
後果是兩種辦法都可以給 people的 name屬性賦值
第一種辦法打印的後果是:人的名字:北京歡送您
第二種和第三種辦法打印的後果是:人的名字:京津追夢人
*/
留意:
1.執行改辦法[NSObjectsetValue:@“value”forKey:@“key”]時,NSObject 是對象,key 一定是NSObject屬性
2.key的值必需正確,假如拼寫錯誤,會呈現異常;
3.valueForKey\ valueForKeyPath辦法依據key的值讀取對象的屬性,setValue:forKey:\ forKeyPath:是依據key的值來寫對象的屬性;
4.引薦運用 valueForKeyPath \ setValue:forKeyPth由於當key的值是沒有定義的,valueForUndefinedKey:這個辦法會被調用,假如重寫了這個辦法,就可以獲取錯誤的key值。
一. KVO —— Key-Value-Observe
鍵值察看:提供一種機制,指定一個被察看對象,當對象某個屬性發作更改時,對象會取得告訴,並作出相應處置.
來一個例子:
#import "ViewController.h"
#import "People.h"
@interface ViewController ()<UITextFieldDelegate>
@property (nonatomic,strong) UILabel *myLabel;
@property (nonatomic,strong) UIButton *myButton;
@property (nonatomic,strong) People *people;
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
self.view.backgroundColor = [UIColorlightGrayColor];
UIButton *button = [UIButtonbuttonWithType:UIButtonTypeCustom];
button.frame =CGRectMake(100,100, 100,40);
button.backgroundColor = [UIColorwhiteColor];
[button addTarget:selfaction:@selector(btnClick)forControlEvents:UIControlEventTouchUpInside];
[self.viewaddSubview:button];
self.myButton = button;
UILabel *label = [[UILabelalloc] init];
label.frame =CGRectMake(100,200, 100,40);
label.backgroundColor = [UIColorwhiteColor];
[self.viewaddSubview:label];
self.myLabel = label;
//創立一個People類的對象
self.people = [[Peoplealloc] init];
/*
注冊察看者
第一個參數observer:察看者(察看self.people對象的屬性變化)
第二個參數keyPath:被察看的屬性稱號(這裡察看self.people中age屬性值的改動)
第三個參數options:察看屬性的新值、舊值等的一些配置(枚舉值,可以依據需求設置,例如這裡可以運用兩項)
第四個參數context:上下文,可以為kvo的回調辦法傳值(例如設定為一個放置數據的字典)
*/
[self.peopleaddObserver:selfforKeyPath:@"age"options:NSKeyValueObservingOptionOld |NSKeyValueObservingOptionNewcontext:nil];
}
//只需self.people的age屬性發作變化,就會調用此回調辦法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
self.myLabel.text = [NSStringstringWithFormat:@"%@",[changevalueForKey:@"new"]];
}
#pragma mark - 按鈕的點擊事情來改動self.people的age屬性
- (void)btnClick{
self.people.age ++;
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
//移除KVO
[self.peopleremoveObserver:selfforKeyPath:@"age"context:nil];
}
@end
【KVC 和KVO的運用】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!