//
// CZViewController.m
// 09-KVC&KVO
//
// Created by apple on 11/07/14.
// Copyright (c) 2014年itcast. All rights reserved.
//
#import"CZViewController.h"
#import"CZPerson.h"
#import"CZStudent.h"
#import"CZBook.h"
@interface CZViewController()
@property(nonatomic,strong)CZStudent*student;
@end
@implementationCZViewController
/**
1> KVC - Key Value Coding鍵值(路徑)編碼
KVC是一種間接修改/讀取對象屬性的一種方式
KVC被稱爲蘋果開發的大招!
KVC在使用時,須要注意,鍵值名稱在對象屬性中必須存在,不然會崩潰!
2> KVO - Key Value Observer鍵值觀察(觀察者模式)
通知中心一樣也是觀察者模式
*/
- (void)viewDidLoad
{
[superviewDidLoad];
// student
CZStudent*student = [[CZStudentalloc]init];
self.student= student;
student.name=@"mary";
student.age=19;
student.no=@"001";
//觀察student的屬性變化
// 1> self 負責監聽的對象 NSNotificationCenter是由通知中心負責
// 2> keyPath 要觀察的屬性鍵值路徑,KVO主要用於對模型屬性變化進行觀察的一種模式
// 通知中心是經過對象POST字符串給通知中心來達到觀察目的的
// 3>選項"|"(而且)位運算,能夠同時支持多個選項
// 4>上下文
[studentaddObserver:selfforKeyPath:@"name"options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOldcontext:@"hello"];
student.name=@"rose";
}
//分類:又被稱爲:隱式代理,靈活度很高,可是代碼的可讀性很差,不建議使用!
// delegate ->顯式代理
//
//觀察監聽方法,全部的監聽事件發生時,都統一調用監聽者的此方法!
// 1> keyPath 觀察的鍵值路徑
// 2> object 觀察的對象
// 3> change 改變,新、舊數值發送過來
// 4> context 上下文,創建觀察時指定的上下文,若是同時監聽多個屬性,能夠經過上下文加以區分
- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context
{
NSLog(@"%@ %@ %@ %@", keyPath, object, change, context);
}
- (void)demoKVC3
{
// student
CZStudent*student = [[CZStudentalloc]init];
student.name=@"mary";
student.age=19;
student.no=@"001";
CZBook*book = [[CZBookalloc]init];
book.bookName=@"iOS";
student.book= book;
// student1
CZStudent*student1 = [[CZStudentalloc]init];
student1.name=@"rose";
student1.age=29;
student1.no=@"002";
CZBook*book1 = [[CZBookalloc]init];
book1.bookName=@"iPhone";
student1.book= book1;
NSArray*students =@[student, student1];
NSLog(@"%@", students);
//需求,將兩個學生的姓名生成一個數組
// NSMutableArray *arrayM = [NSMutableArray array];
// for (CZStudent *stu in students) {
// [arrayM addObject:stu.name];
// }
// NSLog(@"%@", arrayM);
//用KVC取值
//使用KVC取值的時候,若是當前對象不包含指定的鍵值
//那麼KVC會進入對象內部,繼續搜索!
NSLog(@"%@", [studentsvalueForKeyPath:@"name"]);
NSLog(@"%@", [studentsvalueForKeyPath:@"book.bookName"]);
}
- (void)demoKVC2
{
CZStudent*student = [[CZStudentalloc]init];
student.name=@"mary";
student.age=19;
student.no=@"001";
CZBook*book = [[CZBookalloc]init];
book.bookName=@"iOS";
student.book= book;
NSLog(@"%@", student);
//使用KVC來給對象賦值
[studentsetValue:@"rose"forKeyPath:@"name"];
//給數值型屬性賦值時,一樣能夠使用字符串
[studentsetValue:@"16"forKeyPath:@"age"];
[selfdemo:student];
NSLog(@"%@", student);
}
- (void)demo:(CZStudent*)student
{
//使用KVC給Book賦值
// CZBook *book = student.book;
// book.bookName = @"iPhone";
[studentsetValue:@"iPhone"forKeyPath:@"book.bookName"];
}
- (void)kvcDemo1
{
CZPerson*p = [[CZPersonalloc]init];
p.name=@"mary";
p.age=19;
NSLog(@"%@", p);
//使用KVC來給對象賦值
[psetValue:@"rose"forKeyPath:@"name"];
//給數值型屬性賦值時,一樣能夠使用字符串
[psetValue:@"16"forKeyPath:@"age"];
NSLog(@"%@", p);
}
@end數組