2011-03-11 7 views
7

He usado NSNotifications antes, pero esta es la primera vez que intento utilizar KVO en Cocoa Touch.KVO - observeValueForKeyPath no llamado al observar una enumeración

Mi controlador UITableView alterna entre una variedad de fuentes de datos, así que las he encapsulado en diferentes subclases de UITableViewDataSource. Estoy intentando que mi controlador de vista observe una de estas subclases UITableViewDataSource y rastree una enumeración llamada loadState que refleja los modelos del estado de carga.

puse el observador como esto:

[self.siteUpdatesDataSource addObserver:self 
          forKeyPath:@"loadState" 
           options:0 
           context:nil]; 

Desde el depurador puedo ver que el observador se ha registrado:

(gdb) po [self siteUpdatesDataSource] 
<SiteUpdatesTableViewDataSource: 0x651e5a0> 
Current language: auto; currently objective-c 
(gdb) po [[self siteUpdatesDataSource] observationInfo] 
<NSKeyValueObservationInfo 0x651dd70> (
<NSKeyValueObservance 0x651dd10: Observer: 0xc80f1e0, Key path: loadState, Options: <New: NO, Old: NO, Prior: NO> Context: 0x0, Property: 0x651dd90> 

)

Sin embargo, mi método observeValueForKeyPath en mi viewController nunca parece ser llamado. Establecí un punto de inflexión y nada lo alcanza incluso cuando valido que la enumeración ha cambiado.

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

    [self.tableView reloadData]; 
} 

Agradezco cualquier idea sobre lo que me estoy perdiendo.

Respuesta

9

No se puede ver ningún problema. ¿Seguro que cambie loadState propiedad llamando al descriptor de acceso sintetizado o mediante el uso de KVC o manualmente (notificación acerca de los cambios con willChangeValueForKey: y didChangeValueForKey:)?

+0

Gracias que hizo el trick.I'll tratar de experimentar un poco más y averiguar por qué el enum no parece generar el cambio. Estoy usando setter sintetizado y getter para la enumeración y actualizando a través de ellos self.loadState = kDataReady por ejemplo – Nick

+0

Espera, dijiste 'hizo el truco' y la siguiente línea dices 'enum doesn' Parece que genera el cambio. ¿Funcionó o no? No tengo problemas con la propiedad de enumeración sintetizada. – hoha

+0

Disculpe, sí, funcionó. Más tarde descubrí que estaba configurando mi enum incorrectamente en un punto. Desafortunadamente, StackOverflow fue leído. único modo cuando me detuve de nuevo a updaet. Perdón por la confusión a pesar de que mi problema era elsew aquí este enfoque me permitió activar el evento de observador y me ayudó a rastrear el problema. – Nick