Ios 在KVO中使用什么作为密钥路径?

Ios 在KVO中使用什么作为密钥路径?,ios,objective-c,iphone,view,key-value-observing,Ios,Objective C,Iphone,View,Key Value Observing,我有一个视图控制器,其视图会发生变化(例如),我希望观察self.view设置为的任何视图的框架。 以下两者之间有什么区别吗 [self.view addObserver:self forKeyPath:@"frame" options:0 context:nil]; 及 对于第二种情况,如果视图更改,则在新视图的帧更改时仍会收到消息,还是仅在添加观察者时设置的视图帧更改时才会发送消息 即使在添加观察者后视图控制器的视图发生更改,是否有任何方法可以观察帧属性的更改?使用第二条路径@“view.

我有一个视图控制器,其视图会发生变化(例如),我希望观察self.view设置为的任何视图的框架。 以下两者之间有什么区别吗

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

对于第二种情况,如果视图更改,则在新视图的帧更改时仍会收到消息,还是仅在添加观察者时设置的视图帧更改时才会发送消息


即使在添加观察者后视图控制器的视图发生更改,是否有任何方法可以观察帧属性的更改?

使用第二条路径<代码>@“view.frame”将通知您有关帧的更改,即使“视图”本身已更改。Cocoa将自动为keyPath“链”中的每个对象添加观察者(这意味着keyPath中的每个项目都必须与KVO兼容)。

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

第一个

如果在viewController.m中调用了self(aka)viewControllerObject,只要我的属性“frame”发生更改,我就会添加一个名为self(aka)viewControllerObject的观察者

第二个

当名为“view.frame”的关键路径发生更改时,会显示“我作为ViewController”,我会添加我自己的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
还有一件事: 为观察创造一个环境是个好主意 e、 g


是的,KVO的真正、全能的力量被揭示了!
-(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