2010-11-28 10 views
0

Ich habe ein Panel, das auf der ausgewählten Tabellenzeile ausgearbeitet. Offensichtlich muss die Anzeige des Panels oft aktualisiert werden, und ich habe diese Aufgabe in eine NSWindowController-Unterklasse verschoben.Forwarding Eigenschaft Accessoren auf eine Ivar-Methode

Ich möchte die benutzerdefinierte NSWindowController @property s für Dinge wie die Zeichenfolge Werte in den Textfeldern und die Bildwerte in den NSImageViews haben. Weil ich keinen neuen Code in den Accessoren brauche, möchte ich sie @synthesize ihnen. Leider (für mich) gibt es keine Option, Schlüsselpfade in @synthesize property=ivar zu verwenden.

Die offensichtliche Lösung ist meine eigene Accessoren der Form

- (void)setTitle:(NSString *)title 
{ 
    [titleTextField setStringValue:title]; 
} 

- (NSString *)title 
{ 
    return [titleTextField stringValue]; 
} 

zu schreiben, aber ich möchte lieber nicht, dass für jeden von mehreren Eigenschaften von Hand zu tun haben.

Gibt es einen einfacheren Weg? Vielleicht ist eine generische Art, eine Eigenschaft einzurichten, die an eine bestimmte Eigenschaft (außer objectValue etc. sind eigentlich keine richtigen Eigenschaften) eines anderen Objekts weiterleiten soll?

Antwort

0

Ich denke nicht, irgendeine Art von Weiterleitung wird nützlich sein, da die Namen der Eigenschaften auf dem Textfeld anders als diejenigen auf Ihrer Klasse sind.

Es ist natürlich eine gute Idee weg vom Textfeld zu streichen, indem man eine String-Eigenschaft ausgibt, aber wenn man diese Kesselbleche vermeiden möchte, kann es akzeptabel sein, einfach das Textfeld selbst als Eigenschaft zu exponieren. Sie können dies in einigen Apple-APIs sehen, insbesondere auf dem iPhone, wo in SDK 3.0 anstelle von Eigenschaften wie text in einer Tabellenzelle jetzt textLabel. Es ist einfacher und ermöglicht mehr Anpassung, wenn ein Angerufener ein Label oder Textfeld in irgendeiner Weise anpassen möchte.

1

Wenn Sie in Ihrer Klasse valueForUndefinedKey: implementieren, sollten Sie eine letzte Chance erhalten, Schlüssel-Pfad-Suchvorgänge aufzulösen und sie alle an das andere Objekt weiterzuleiten. Dies ist jedoch sicherlich nicht performant und bringt Ihnen nur dann signifikante Vorteile, wenn die meisten Eigenschaftennamen, die Sie durchlaufen, mit denen des Zielobjekts übereinstimmen.

0

Sie haben einen Widerspruch, Sie sagen, Sie brauchen keinen neuen Code in den Accesoren, also würden Sie sie gerne synthetisieren, aber der Code, den Sie brauchen, ist völlig neuartig. Eigenschaften sind syntaktischer Zucker für einige häufige Fälle, von denen dies keiner ist.

Es gibt mehrere Möglichkeiten zu tun, was Sie wollen, z. wie @Justin suggeriert overvalid setvalue: forundefinedkey: - Sie brauchen nur eine Suche nach vorne Ziele, aber der Zucker der Eigenschaften ist nicht gut dafür geeignet.

+0

Was ich mit "Ich brauche keinen neuen Code in den Accessoren" gemeint ist, dass ich nichts tun möchte, wie einen Wert beim ersten Zugriff langsam laden usw., so würden synthetisierte Accessoren akzeptabel sein (wenn sie möglich wären)). – Richard