• kvo


    //  BOY.h
    
    #import <Foundation/Foundation.h>
    
    @interface BOY : NSObject
    
    @property (nonatomic,retain) NSString * boyName;
    @end
    //  GIRL.h
    
    #import <Foundation/Foundation.h>
    
    @interface GIRL : NSObject
    @property (nonatomic,retain) NSString * girlName;
    @end
    //  RootViewController.m
    
    #import "RootViewController.h"
    #import "GIRL.h"
    #import "BOY.h"
    @interface RootViewController ()
    {
        GIRL * xiaoGirl;
        BOY * xiaoBoy;
    }
    @end
    
    @implementation RootViewController
    
    -(void)createUI
    {
        NSArray * arr = @[@"BOY",@"GIRL"];
        for(int i = 0;i<2;i++)
        {
            UIButton * btn = [UIButton buttonWithType:UIButtonTypeCustom];
            btn.frame = CGRectMake(50 + 130 * i, 300, 100, 100);
            [btn setTitle:arr[i] forState:UIControlStateNormal];
            [btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
            btn.tag = i + 1;
            [btn addTarget:self action:@selector(pressBtn:) forControlEvents:UIControlEventTouchUpInside];
            [self.view addSubview:btn];
            
            UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(10, 100 + 50 * i, 300, 40)];
            label.backgroundColor = [UIColor greenColor];
            label.tag = 100 + i;
            [self.view addSubview:label];
            label.textAlignment = NSTextAlignmentCenter;
            [label release];
        }
    }
    -(void)pressBtn:(id)sender
    {
        UIButton * btn = (UIButton *)sender;
        if(btn.tag == 1)
        {
            [xiaoBoy setValue:@"赵又廷" forKey:@"boyName"];
        }
        else
        {
            [xiaoGirl setValue:@"高圆圆" forKey:@"girlName"];
        }
    }
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        [self createUI];
        
        xiaoGirl = [[GIRL alloc]init];
        xiaoBoy = [[BOY alloc]init];
        
        //通过KVC对成员属性进行赋值
        [xiaoBoy setValue:@"黄晓明" forKey:@"boyName"];
        [xiaoGirl setValue:@"Boby" forKey:@"girlName"];
        
        //初始情况下label上的内容显示
        UILabel * label1 = (UILabel *)[self.view viewWithTag:100];
        UILabel * label2 = (UILabel *)[self.view viewWithTag:101];
        
        label1.text = [xiaoBoy valueForKey:@"boyName"];
        label2.text = [xiaoGirl valueForKey:@"girlName"];
        
        //KVO
        //KVO 是 key-value-observer 键值观察者
        //观察某个属性发生改变触发相应方法
        
        //为BOY和GIRL的对象所包含的成员属性添加观察者
        
        //1、添加观察者对象指针 谁观察成员变量的变化 就添加哪个对象指针 一般都是当前类的对象作为观察者
        //2、添加的是被观察的成员属性名称
        //3、被观察的成员属性变化的前后值
        //4、直接设置为nil
        [xiaoBoy addObserver:self forKeyPath:@"boyName" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context: nil];
        [xiaoGirl addObserver:self forKeyPath:@"girlName" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
        //如果被观察的对象的成员属性发生改变 就会调用下面的方法
    }
    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    {
        /*
         1、被观察的成员属性的名称
         2、被观察的成员属性所属的对象指针
         3、存放的是被观察的成员属性变化的前后值(旧值的key是old   新值的key是new)
         */
        UILabel * label1 = (UILabel *)[self.view viewWithTag:100];
        UILabel * label2 = (UILabel *)[self.view viewWithTag:101];
        
        //isMemberOfClass:判断对象指针是否属于某个类
        if([object isMemberOfClass:[BOY class]])
        {
            NSString * older = [change objectForKey:@"old"];
            NSString * newer = [change objectForKey:@"new"];
            NSString * string = [NSString stringWithFormat:@"old:%@ -- new:%@",older,newer];
            label1.text = string;
        }
        else
        {
            NSString * older = [change objectForKey:@"old"];
            NSString * newer = [change objectForKey:@"new"];
            NSString * string = [NSString stringWithFormat:@"old:%@ -- new:%@",older,newer];
            label2.text = string;
        }
        
        
    }
  • 相关阅读:
    上传文件(一)
    momentjs
    asp.net中session的原理及应用
    聊天程序(基于Socket、Thread)
    接口与抽象类
    asp.net 发送邮件
    Web.Config文件详解
    Apache Sqoop
    HBase 数据模型(Data Model)
    HBase框架学习之路
  • 原文地址:https://www.cnblogs.com/sayimba/p/5663422.html
Copyright © 2020-2023  润新知