2012-02-13 9 views
6

Ho un controller di vista con una vista che cambia (per esempio), e vorrei osservare il frame di qualsiasi vista a cui self.view è impostato. C'è qualche differenza tra:Che cosa usare come keypath in KVO?

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

e

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

Per la seconda, se la vista cambia saranno messaggi ancora essere ricevute in caso di modifiche del telaio della nuova vista, o sarà solo inviare messaggi se la cornice della vista impostata quando è stato aggiunto l'osservatore?

C'è un modo per osservare le modifiche alla proprietà del frame anche se la vista del controller della vista cambia dopo aver aggiunto l'osservatore?

risposta

7

Utilizzare il secondo percorso. @"view.frame" ti informerà delle modifiche al frame anche quando la "vista" stessa viene modificata. Il cacao aggiungerà automaticamente osservatori per ogni oggetto nella "catena" keyPath automaticamente (il che significa che ogni elemento nel keyPath deve essere compatibile con KVO).

+0

Sì, il vero, potere onnipotente di KVO è stato rivelato! –

2

hai chiesto se v'è una differenza tra i due, la risposta è sì, v'è una differenza tra di loro:

Il primo

dice "come una visione", aggiungo un osservatore ha chiamato self (aka) viewControllerObject, se lo hai richiamato in viewController.m ogni volta che la mia proprietà denominata "frame" è cambiata.

il secondo

dice "come ViewController" Sto aggiungendo myselfAsAnObserver ogni volta theKeyPath chiamato "view.frame" è cambiato.

Dal momento che ogni osservatore dovrebbe attuare

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

Per questo caso non si noterà molta differenza perché si è aggiunto un viewController come osservatore in uno dei metodo di cui sopra, ma farà la differenza quando si è trattare con oggetti diversi. Ma la regola è semplice, ogni osservatore aggiunto dovrebbe attuare il

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

Ancora una cosa: È una buona idea per creare un contesto per l'osservazione esempio

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