2011-06-15 12 views
6

tengo subclase de NSObject tener 70 propiedades, i necesidad de observar el cambio en todos ellos y sin la adición de cada propiedad de uno en uno utilizando siguiente:cómo observar cambio en las propiedades NSObject

[self addObserver: self 
     forKeyPath: @"propertyname" 
      options: NSKeyValueObservingOptionNew 
      context: NULL]; 

. Por favor, hágame saber la manera más fácil de hacerlo. En este momento, necesito una solución para 10.5 y posterior.

Respuesta

10

Puede utilizar la función de tiempo de ejecución Object C class_copyPropertyList() para obtener todas las propiedades de esa clase, luego recorrer la lista y usar property_getName() para obtener algo que funcione con la observación del valor de la clave.

O podría implementar keyPathsForValuesAffectingValueForKey: en la clase en cuestión. Crea una nueva clave en la clase, que solo vamos a usar para la detección de cambios. Luego, implemente el método anterior, y si el string pasado es igual a su nueva clave, devuelva un conjunto que contenga los nombres de las setenta propiedades. Luego puede hacer KVO en su nueva clave, y recibirá una notificación cuando algo cambie. Al hacerlo de esta manera, no sabrá qué propiedad cambió, solo que una de ellas lo hizo.

Podría ayudarnos decirnos por qué necesita hacer esto, ya que podría haber un mejor patrón de diseño para usar.

+0

Gracias por su valiosa respuesta. Las propiedades de mi clase se vinculan directamente con varios controles de IU en XIB. Necesito permitir que los usuarios detecten cambios en los controles de IU actuales y notifiquen al usuario que guarde los cambios si cierran el XIB principal sin guardar los valores actuales. Trataré de implementar como mencionas y me avisarás si eso funciona para mí. – AmitSri

+0

Dado ese caso de uso, realmente quiero que haya una mejor manera de hacerlo. He estado leyendo alrededor de NSObjectController en caso de que haga lo que quiere, pero no puedo encontrar mucha información para situaciones en las que no está utilizando Core Data. No lo he intentado, pero parece una idea: crear una subclase NSObjectController, crear instancias en IB y configurar su objeto de contenido para que sea su NSObject. Vincula toda tu UI al NSObjectController, con las mismas teclas. Luego, en el código, anule 'objectDidEndEditing:' en su subclase de controlador, y haga que esa llamada sea un método en cualquier clase que haga el guardado. –

+0

Gracias por su sugerencia, veré si puedo cambiar mi implementación en el futuro como sugirió. Actualmente, he implementado keyPathsForValuesAffectingValueForKey como sugirió y parece funcionar ahora. – AmitSri

Cuestiones relacionadas