ios 监听一个控制器的属性_ios - kvo观察者示例(监听类的属性变化)
首先創建Person分類
#import
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) float height;
@end
.m中不做任何事情
控制器.m中
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@property (nonatomic, strong) Person *per;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Person * per = [Person new];
per.name = @"zhangsan";
per.height = 1.2;
self.per = per;
// kvo 為per.name添加觀察者
[per addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
// kvo 為per.height添加觀察者
[per addObserver:self forKeyPath:@"height" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
}
只要監聽的屬性name 和 height的值發生了改變就會觸發下面的方法
/** 添加觀察者必須要實現的方法 */
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
/** 打印新老值 */
// 從打印結果看 分別打印出了 name 與 height的新老值
NSLog(@"old : %@ new : %@",[change objectForKey:@"old"],[change objectForKey:@"new"]);
// NSLog(@"keypath : %@",keyPath);
// NSLog(@"change : %@",change);
}
由于對person.name 以及height的屬性都做了監聽,只要觸摸后屬性的值發生改變就做得到通知觸發通知方法 -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 則可以在其內部做你想要做的事
/** 觸摸改變per.name屬性值 */
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
self.per.name = @"helloworld";
self.per.height = 3.3;
}
一定要記得移除
/** 移除 */
-(void)dealloc{
[self.per removeObserver:self forKeyPath:@"name" context:nil];
[self.per removeObserver:self forKeyPath:@"height" context:nil];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
注意點:
為某個對象的某個屬性添加觀察者,最后一定要移除,否則可能會崩潰
實現方法-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context則只要監聽的屬性發生改變就會觸發.
總結
以上是生活随笔為你收集整理的ios 监听一个控制器的属性_ios - kvo观察者示例(监听类的属性变化)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: unity3d 动态合批设置_Unity
- 下一篇: 30 多年的软件经验,总结出 10 个编