KVO
来源:互联网 发布:家庭购物记账软件 编辑:程序博客网 时间:2024/06/04 01:16
涉及3个方法:
1.为对象的某个属性添加观察者
例如为lable的text属性添加观察者,self表示控制器是lable的text属性的观察者
[lable addObserver:selfforKeyPath:@"text"options:0context:nil];
- (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];
}
//当labe1的text属性被修改时,就会回调下面这个方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"mylable属性被修改为%@",_myLable.text);
_myLable2.text = [NSStringstringWithFormat:@"lable1的属性被修改为%@",_myLable.text];
}
@end
- KVO
- kvo
- kvo
- KVO
- KVO
- Kvo
- KVO
- kvo
- KVO
- KVO
- KVO
- KVO
- KVO
- KVO
- KVO
- KVO
- KVO
- KVO
- 缺少 .BLL文件解决方案
- java.io.Serializable
- Swing
- 计算机技术领域当前的主流技术及其社会需求调查报告
- SVN_Eroor:URL access forbidden for unknown reason svn: access to&n
- KVO
- 2张图教你认识世界人口分布
- jquery 雪花飘落的组件
- 151130ios判断是直机还是模拟器
- js获得焦点后光标移到末尾
- Android屏幕密度(Density)和分辨率的解释
- java 获取配置文件里的文件,常用的方法
- Android SDK在线更新镜像服务器
- linux su和sudo命令的区别