什么用作KVO的关键路径?

时间:2012-02-13 15:23:41

标签: ios objective-c iphone view key-value-observing

我有一个视图控制器,其视图发生了变化(例如),我想观察self.view设置为的任何视图的框架。 之间有什么区别:

[self.view addObserver:self forKeyPath:@"frame" options:0 context:nil];

[self addObserver:self forKeyPath:@"view.frame" options:0 context:nil];

对于第二个,如果视图更改将在新视图的帧更改时仍然收到消息,或者它是否仅在添加观察者时设置的视图帧发送消息?

即使添加观察者后视图控制器的视图发生了变化,有没有办法观察帧属性的变化?

2 个答案:

答案 0 :(得分:7)

使用第二条路径。即使“视图”本身发生更改,@"view.frame"也会通知您有关帧更改的信息。 Cocoa将自动为keyPath“chain”中的每个对象添加观察者(这意味着 keyPath中的每个项必须与KVO兼容)。

答案 1 :(得分:2)

你问两者之间是否存在差异,答案是肯定的,它们之间存在差异:

第一个

说“我作为一个视图”,我添加了一个名为self(aka)viewControllerObject的观察者,如果你在viewController.m中调用了这个,只要我的名为“frame”的属性被更改。

第二个

称我为“ViewController”每当更改名为“view.frame”的关键路径时,我就会添加自己的AsAnObserver。

因为每个观察者都应该实施

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

对于这种情况,您不会注意到很多区别,因为您在上述任一方法中添加了一个viewController作为观察者,但是当您处理不同的对象时它会有所不同。但规则很简单,每个添加的观察者都应该实现

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

还有一件事: 为观察创造背景是个好主意 例如

//In MyViewController.m 

//.. 
static int observingViewFrameContext


// In ...
[self addObserver:self 
       forKeyPath:@"view.frame" 
          options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld 
          context:&observingViewFrameContext];


// .. don' forget to remove an observer ! too