你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> KVC 和KVO的運用

KVC 和KVO的運用

編輯:IOS開發綜合

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的運用】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved