2012-02-13 8 views
6

私は、(例えば)変更するビューを持つビューコントローラを持っており、self.viewが設定されているビューのフレームを観察したいと思います。 の間に違いがあります:KVOのキーパスとして何を使用しますか?

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

2つ目については

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

、ビューの変更がメッセージがまだ新しいビューのフレームの変更は、またはそれは場合にのみ、メッセージを送信する際に受け取っされる場合は、オブザーバーが追加されたときに設定されたビューのフレーム?

オブザーバーを追加した後にビューコントローラーのビューが変更されても、フレームプロパティの変更を観察する方法はありますか?

答えて

7

2番目のパスを使用します。 @"view.frame"は、「ビュー」自体が変更されてもフレームの変更について通知します。 Cocoaは自動的にkeyPath "チェーン"内のすべてのオブジェクトのオブザーバーを追加します(つまり、のkeyPath内のすべてのアイテムはKVO互換でなければなりません)。

+0

いや、本当の、全能の力、観察 のためのコンテキストを作成するために その良いアイデア:しかし、ルールは単純ですが、それぞれ追加観察者は

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

もう一つを実装する必要がありますKVOが明らかにされた! –

2

次の2つの間に差がある場合、答えはイエスである、それらの間の差がある質問:

最初の1

は、私が追加、「ビューとして私を」と言います"frame"という名前のプロパティが変更されるたびにviewController.mでこれを呼び出すと、observerという名前のself(別名)viewControllerObjectという名前です。

2つ目

theKeyPathという名前の "view.frame" が変更されるたびに、私はmyselfAsAnObserverを追加している "のViewControllerとして私を" 言います。すべての観察者が上記の方法のいずれかでのオブザーバーとしての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 
関連する問題