Erstellen ein Objective-C-Objekt, das ein anderes Objekt mit der gleichen Schnittstelle Wraps - KVC / KVO Fragen

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

Frage

Ich brauche ein Objekt in einer Klassenhierarchie erstellen, die ein Objekt aus einem anderen wickelt. Beide haben sehr ähnliche Schnittstellen, und ich möchte automatisch meine Wrapper Weiterleiten von Nachrichten, um es nicht zu seinem Ziel in lieu erkennt seine eigenen Eigenschaften zu implementieren. Ich habe diese an die Arbeit mit so etwas wie folgt aus:

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

    return self;
}

Aber das funktioniert nicht für die Schlüssel-Wert-Codierung. Wie kann ich gehen, um meine Wrapper implementieren Schlüsselwert in einer Weise Codierung über aufweist, der die Eigenschaften seiner gewickelt Objekt verwendet?

War es hilfreich?

Lösung

Sie werden zu überschreiben valueForKey: und setValue:forKey: haben. Ein Beispiel:

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

Der schwierige Teil wird die Schlüssel zu bestimmen, das verpackte Objekt zu implementieren ist. Der einfache Weg ist zu hart Code sie, aber das ist nicht zu schön. Wenn Sie es sehr allgemein tun wollen, werden Sie etwas über die Reflexion APIs von Objective-C tun. Hier sind zwei Ideen:

  • Alle Ihre Eigenschaften sind Eigenschaften tatsächlich erklärt. Sie können die Laufzeitfunktion class_getProperty verwenden sie die Existenz zu überprüfen und gegebenenfalls zusätzliche Informationen extrahieren. Die Prüfung könnte dann so aussehen:. if (class_getProperty([self.wrappedObject class], [key UTF8String]) != nil) {...}

  • Ihre Eigenschaften auch Accessoren nur haben könnten. Dann sollten Sie die Selektoren aus dem Schlüssel und Verwendung [self.wrappedObject respondsToSelector: ...] konstruieren wie zuvor. Der Name des Getter ist der Schlüssel plus ein Doppelpunkt. Das Problem dabei ist jedoch Eigenschaften, die unterschiedlichen Getter / Setter Namen hat. Die erste Option ist auf jeden Fall die beste.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top