我有一个视图控制器,其视图发生了变化(例如),我想观察self.view设置为的任何视图的框架。 之间有什么区别:
[self.view addObserver:self forKeyPath:@"frame" options:0 context:nil];
和
[self addObserver:self forKeyPath:@"view.frame" options:0 context:nil];
对于第二个,如果视图更改将在新视图的帧更改时仍然收到消息,或者它是否仅在添加观察者时设置的视图帧发送消息?
即使添加观察者后视图控制器的视图发生了变化,有没有办法观察帧属性的变化?
答案 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