Objective-C入门18:KVO

来源:互联网 发布:陈浩民 妻子 知乎 编辑:程序博客网 时间:2024/05/20 14:19

Objective-C入门18:KVO

main.m

#import <Foundation/Foundation.h>#import "Dog.h"#import "Parson.h"#import "Yinger.h"#import "Baomu.h"int main(int argc, const char * argv[]) {    @autoreleasepool {                //        key---value---observer  (键值观察者)        //        通过 key 来观察 value 的变化 去做出响应                //        KVO (键值观察者)主要用于视图交互方面,比如界面的某些数据变化了,        //        界面的显示也跟着需要变化,那就是要建立数据和界面的关联                //        KVO 是一对一的传值        //        通过 key 来监测 值是否发生改变  如果发生改变 就会自动调用 KVO 的响应方法                        Dog *daHuLang = [ [ Dog alloc ] init ] ;        daHuLang.face = @"smile" ;        //        使用的  KVC  的知识        [ daHuLang setValue:@"耸拉着" forKey:@"weiBa" ] ;         Parson *liBai = [ [ Parson alloc ] init ] ;        [ liBai  watchDog:daHuLang ] ;        daHuLang.face = @"wang!wang!wang!" ;        [ daHuLang setValue:@"摇着尾巴" forKey:@"weiBa" ] ;        Yinger *daBao = [ [ Yinger alloc ] init ] ;        [ daBao setValue:@"平静" forKey:@"zhuangtai" ] ;        Baomu *baomu = [ [ Baomu alloc ] init ];        [ baomu watchYinger:daBao ] ;        [ daBao setValue:@"ha~ha~" forKey:@"zhuangtai" ] ;//        [ daBao setValue:@"wa~wa~" forKey:@"zhuangtai" ] ;               }    return 0;}


Parson.h

#import <Foundation/Foundation.h>@class Dog ;@interface Parson : NSObject{    Dog *watchDog ;}// 遇到一只狗 观察狗表情的变化- (void)watchDog:(Dog *) dog ;@end



Parson.m

<pre name="code" class="objc">#import "Parson.h"#import "Dog.h"@implementation Parson- (void)watchDog:(Dog *) dog{    watchDog = dog ;    //    观察狗的表情    [ watchDog addObserver : self forKeyPath:@"face" options : NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context : nil ] ;        [ watchDog addObserver : self forKeyPath:@"weiBa" options :     NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context : nil ] ;  }// 狗的新旧表情发生改变  会自动调用这个方法// keyPath 来判断  是不是咱们观察的  key 对应的值 发生改变// change 是一个字典  字典里面放了 新旧属性值的内容- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{    if ( [ keyPath isEqualToString:@"face" ] )    {        NSLog(@"%@",change);        NSLog(@"狗的表情由%@变成%@",change[@"old"],change[@"new"]);        [ self shutdown ] ;        }    if ( [ keyPath isEqualToString : @"weiBa" ] )    {        NSLog(@"狗的尾巴由%@变成%@",change[@"old"],change[@"new"]);        [ self toEat ] ;    }}- (void)toEat{    NSLog(@"扔一大块肉~" ) ;}- (void)shutdown{    NSLog( @"打死" ) ;}- (void)dealloc{   [ watchDog removeObserver : self forKeyPath:@"face" ] ;    [ watchDog removeObserver : self forKeyPath:@"weiBa" ] ;}@end

Dog.h

#import <Foundation/Foundation.h>@interface Dog : NSObject{    NSString *weiBa ;}@property (nonatomic,copy) NSString *face ;@end


Dog.m

#import "Dog.h"@implementation Dog@end


Baomu.h

#import <Foundation/Foundation.h>@class Yinger ;@interface Baomu : NSObject{    Yinger *watchYinger ;}//  观察婴儿表情的变化- (void)watchYinger:(Yinger *) yinger ;@end


Baomu.m

#import "Baomu.h"#import "Yinger.h"@implementation Baomu- (void)watchYinger:(Yinger *)yinger{    watchYinger = yinger ;    //    观察婴儿的表情    [ watchYinger addObserver : self forKeyPath:@"zhuangtai" options : NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context : nil ] ;  }// 狗的新旧表情发生改变  会自动调用这个方法// keyPath 来判断  是不是咱们观察的  key 对应的值 发生改变// change 是一个字典  字典里面放了 新旧属性值的内容- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{    if ( [ keyPath isEqualToString:@"zhuangtai" ] )    {        NSLog(@"%@",change);        NSLog(@"婴儿的表情由%@变成%@",change[@"old"],change[@"new"] );        if ( [ change[@"new"] isEqualToString: @"wa~wa~" ] )                   {                        NSLog( @"保姆喂奶" ) ;                   }        else if ( [ change[@"new"] isEqualToString: @"ha~ha~" ] )                  {                        NSLog(@"保姆给一个玩具" ) ;                   }            }}- (void)dealloc{    [ watchYinger removeObserver : self forKeyPath:@"zhuangtai" ] ;}@end


Yinger.h

#import <Foundation/Foundation.h>@interface Yinger : NSObject{    NSString *zhuangtai ;}@end



Yinger.m

#import "Yinger.h"@implementation Yinger@end


0 0
原创粉丝点击