利用KVO監聽物件屬性
阿新 • • 發佈:2019-02-20
例如想通過kvo監聽當前控制器view的frame改變
- 通過addObserver增加監聽
#define keyPath(objc,keyPath) @(((void)objc.keyPath,#keyPath))
// Observer:觀察者 誰想監聽
// KeyPath:監聽的屬性
// options:監聽新值的改變
[self.view addObserver:self forKeyPath:@"frame"
options:NSKeyValueObservingOptionNew context:nil];
//最好使用下面的方式,避免手動輸入字串錯誤
[self.view addObserver:self forKeyPath:keyPath(self.view, frame)
options:NSKeyValueObservingOptionNew context:nil];
說明:// 在檔案頭部加上keyPath的自定義巨集,把屬性轉換為字串
- 在當前控制器中實現observeValueForKeyPath方法,每當屬性改變就會呼叫這個方法
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object change:(NSDictionary *)change
context:(void *)context
{
if([keyPath isEqualToString:@"price"])
{
myLabel.text = [stockForKVO valueForKey:keyPath(self.view, frame)];
}
}
- kvo作為一箇中間物件,在當前控制器銷燬時任然會存在,所以在銷燬時應該移除當前觀察釋放kvo物件
- (void)dealloc
{
// 移除觀察者
[self.view removeObserver:self forKeyPath:keyPath(self.view, frame)];
}