KVO

来源:互联网 发布:家庭购物记账软件 编辑:程序博客网 时间:2024/06/04 01:16

涉及3个方法:

1.为对象的某个属性添加观察者

例如为lable的text属性添加观察者,self表示控制器是lable的text属性的观察者

    [lable addObserver:selfforKeyPath:@"text"options:0context:nil];


2.重写回调方法

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

//当lable的text属性被修改了之后,你想干什么,就写在这里

}


3.当对象被销毁时,移除观察者(如果不移除,可能因为对象已经不在了,但通知还在,导致崩溃)

- (void)dealloc

{

    [self.myLableremoveObserver:selfforKeyPath:@"text"];

}



源代码如下,拷贝后即可运行:

//

//  ViewController.m

//  KVOLearn

//

//  Created by wusiping on 15/11/30.

//  Copyright (c) 2015 wusiping. All rights reserved.

//




#import "ViewController.h"


@interface ViewController ()

@property(nonatomic,weak)UIButton *btn;

@property(nonatomic,weak)UILabel *myLable;

@property(nonatomic,weak)UILabel *myLable2;




@end


@implementation ViewController


- (void)viewDidLoad {

    [superviewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    [self addBtn];

    [self addLable];

    [selfaddLable2];

}


//添加一个按钮,来改变lable的属性

- (void)addBtn

{

    CGFloat btnX = 200;

    CGFloat btnY = 200;

    CGFloat btnW = 100;

    CGFloat btnH = 50;

    CGRect btnFrame = CGRectMake(btnX, btnY, btnW, btnH);

    UIButton *btn = [[UIButtonalloc]initWithFrame:btnFrame];

    btn.backgroundColor = [UIColorredColor];

    [btn setTitle:@"数字加一"forState:UIControlStateNormal];

    _btn = btn;

    [_btnaddTarget:selfaction:@selector(touchBtn:)forControlEvents:UIControlEventTouchUpInside];

    [self.viewaddSubview:_btn];

    

}


//点击按钮时,触发的操作

- (void)touchBtn:(UIButton *)btn

{

    static int i =0 ;

    _myLable.text = [NSStringstringWithFormat:@"哈哈%d",i ];

    i ++;

}



//用于展示lable1

- (void)addLable

{

    CGFloat lableX = 50;

    CGFloat lableY = 50;

    CGFloat lableW = 100;

    CGFloat lableH = 50;

    CGRect lableFrame = CGRectMake(lableX, lableY, lableW, lableH);

    UILabel *lable = [[UILabelalloc]initWithFrame:lableFrame];

    lable.text = @"hello";

    //添加观察者

    [lable addObserver:selfforKeyPath:@"text"options:0context:nil];

    _myLable = lable;

    [self.viewaddSubview:_myLable];


}


//取消观察者

- (void)dealloc

{

    [self.myLableremoveObserver:selfforKeyPath:@"text"];

}


//lable显示labe1的变化

- (void)addLable2

{

    CGFloat lable2X = 50;

    CGFloat lable2Y = 150;

    CGFloat lable2W = 300;

    CGFloat lable2H = 50;

    CGRect lable2Frame = CGRectMake(lable2X, lable2Y, lable2W, lable2H);

    UILabel *lable2 = [[UILabelalloc]initWithFrame:lable2Frame];

    _myLable2 = lable2;

    [self.viewaddSubview:_myLable2];

    

}



//labe1text属性被修改时,就会回调下面这个方法

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

    NSLog(@"mylable属性被修改为%@",_myLable.text);

    _myLable2.text = [NSStringstringWithFormat:@"lable1的属性被修改为%@",_myLable.text];

}


@end













0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 wi-fi信号差怎么办 无线dns未响应怎么办 影客票务过期怎么办 默认主页改不了怎么办 快递派件不成功怎么办 韵达快递不派件怎么办 中通快递不派件怎么办 理财回执单丢失怎么办 理财回单丢了怎么办 杭州市老年优待卡怎么办 网络连接不到服务器怎么办 即时库存有负数怎么办 电脑软件被拦截怎么办 超市无条码商品怎么办 场外期权有诈骗怎么办 ip地址访问受限怎么办 电脑ip地址受限怎么办 百度云资源打不开怎么办 百度网盘看文件字太小怎么办 密码输入三次错误怎么办 notes邮箱满了怎么办 小米8买不到怎么办 小米付款不发货怎么办 小米金融还款中怎么办 股票遇到闪崩怎么办 微信插件没有怎么办 excel打印太小怎么办 工地临时人员死亡怎么办 哺乳期乳腺增生疼怎么办 哺乳期有乳腺增生怎么办 哺乳期得了乳腺增生怎么办 中等教育认证花名册丢失怎么办 哺乳期囊性结节怎么办 乳腺增生堵奶怎么办 月子期乳房增生怎么办 母乳期乳腺增生怎么办 上市公司破产了股票怎么办 iptv错误码30022怎么办 电信iptv不清晰怎么办 电信iptv卡顿怎么办 pr滚动字幕闪烁怎么办