1. 程式人生 > >利用KVO監聽物件屬性

利用KVO監聽物件屬性

例如想通過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)];
}