Ios 在KVO中使用什么作为密钥路径?
我有一个视图控制器,其视图会发生变化(例如),我希望观察self.view设置为的任何视图的框架。 以下两者之间有什么区别吗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 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