Creación de un objeto de Objective-C que envuelve otro objeto con la misma interfaz - cuestiones KVC / MVA

StackOverflow https://stackoverflow.com/questions/3568819

Pregunta

Es necesario crear un objeto en una jerarquía de clases que envuelve un objeto desde una diferente. Ambos tienen interfaces muy similares, y me gustaría tener mi envoltorio automáticamente reenviar mensajes que no reconoce a su objetivo, en lugar de aplicar sus propias propiedades. Tengo este trabajo a usar algo como esto:

- (id)forwardingTargetForSelector:(SEL)sel 
{
    if ([self.wrappedObject respondsToSelector:sel])
        return self.wrappedObject;

    return self;
}

Sin embargo, esto no funciona para el valor clave de codificación. ¿Cómo puedo ir sobre tener mi envoltorio implementar clave-valor de codificación en una forma que utiliza las propiedades de su objeto envuelto?

¿Fue útil?

Solución

tendrá que valueForKey: sobrescritura y setValue:forKey:. Un ejemplo:

- (id)valueForKey:(NSString *)key {
  if (/* wrapped object has key */)
    return [self.wrappedObject valueForKey: key];
  else
    return [super valueForKey: key];
}

La parte difícil será determinar las claves del objeto envuelto no implementar. La manera más fácil es difícil que el código, pero que no es demasiado agradable. Si desea hacerlo muy genérico, que va a hacer algo utilizando las API de reflexión de Objective-C. Aquí hay dos ideas:

  • Todas sus propiedades son en realidad las propiedades declaradas. Puede utilizar la función de tiempo de ejecución class_getProperty para comprobar su existencia y extraer opcionalmente información adicional. La verificación, podría tener este aspecto:. if (class_getProperty([self.wrappedObject class], [key UTF8String]) != nil) {...}

  • Sus propiedades también podría tener sólo descriptores de acceso. A continuación, usted debe construir los selectores de la clave y el uso [self.wrappedObject respondsToSelector: ...] tal como lo hizo antes. El nombre del comprador es la clave más dos puntos. El problema con esto, sin embargo, es que tienen diferentes propiedades nombre de captador / definidor. La primera opción es sin duda la mejor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top