2012-02-13 10 views
6

Tengo un controlador de vista con una vista que cambia (por ejemplo), y me gustaría observar el marco de cualquier vista que self.view está configurado. ¿Hay alguna diferencia entre:¿Qué usar como keypath en KVO?

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

y

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

Para el segundo, si se van mensajes todavía ser recibido la vista cambia cuando cambia el marco de la nueva vista, o serán sólo enviar mensajes si el marco de la vista que se estableció cuando se agregó el observador?

¿Hay alguna manera de observar los cambios en la propiedad del marco incluso si la vista del controlador de vista cambia después de agregar el observador?

Respuesta

7

Use la segunda ruta. @"view.frame" le notificará acerca de los cambios de marco incluso cuando se modifique la "vista". Cocoa agregará observadores para cada objeto en la "cadena" keyPath automáticamente (lo que significa cada artículo en keyPath debe ser compatible con KVO).

+0

Sí, el verdadero poder, omnipotente de ¡KVO fue revelado! –

2

Se preguntó si hay una diferencia entre los dos, la respuesta es sí, hay una diferencia entre ellos:

El primero

dice "yo como una visión", agrego un observador llamado self (aka) viewControllerObject, si invoca esto en viewController.m siempre que se cambie mi propiedad llamada "frame".

el segundo

dice que "mi como ViewController" Estoy agregando cada vez myselfAsAnObserver theKeyPath nombrado "view.frame" se cambia.

Puesto que cada observador debe aplicar

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

Para este caso no se dará cuenta mucha diferencia, ya que ha añadido un viewController como observador en uno de los métodos anteriormente, sino que hará una diferencia cuando estás tratar con diferentes objetos. Pero la regla es simple, cada observador añadido debe implementar el

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

Una cosa más: Es una buena idea para crear un contexto para la observación por ejemplo

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