2012-02-13 56 views
6

我有一個視圖控制器的視圖更改(例如),我想觀察self.view設置爲任何視圖的框架。 是否有任何區別:什麼用作KVO的關鍵路徑?

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

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

對於第二個,如果視圖改變將消息仍然收到當新的視圖的框架的變化,或將它只有在發送郵件觀察者添加時設置的視圖框架?

即使視圖控制器的視圖在添加觀察者後發生更改,是否有任何方法可以觀察對幀屬性的更改?

回答

7

使用第二條路徑。即使當「視圖」本身發生變化時,@"view.frame"也會通知您有關幀的更改。 Cocoa會自動爲keyPath「chain」中的每個對象添加觀察者(這意味着keyPath中的每個項目必須與KVO兼容)。

+0

是啊,真實,無所不能的權力KVO揭曉! – 2014-03-18 03:10:04

2

你問我有兩者之間的差別,答案是肯定的,它們之間的差異:

第一個

說:「我作爲一個視圖」,我想補充一個名爲self(又名)viewControllerObject的觀察者,如果你在我的名爲「frame」的屬性改變的時候在viewController.m中調用了它。

第二個

說「我的視圖控制器」我加入myselfAsAnObserver每當theKeyPath名爲「view.frame」被改變。

由於每個觀察者應該執行

-(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