NSValueTransformer + NSPopupButton

  • NSValueTransformer + NSPopupButton

    Hallo,

    ich habe einen NSValueTransformer-Subclass und ein NSPopupButton. Der NSPopupButton wird mittels seines contentValues Binding befüllt. Klappt auch wunderbar. Nun gebe ich zusätzlich noch einen eigenen Value Transformer beim contentValues Binding an.

    Ergebnis: Die Methoden meines eigenen Value Transformers werden nicht aufgerufen. Wende ich meinen Value Transformer auf das value Binding einer NSTableColumn an funktioniert alles wie erwartet. An meinem Value Transformer kann es also nicht liegen.

    Ich habe brav gegoogled und das gefunden: cocoabuilder.com/archive/message/cocoa/2005/5/15/135970

    Auszug: "Unfortunately, value transformers for contentValues in popups don't have any effect - they're not even called (the same value transformer works just fine in a table view)."

    So wie bei mir also. Die einzige Antwort, die auf seine Frage gegeben wurde war, dass er die Value Transformer Logik auch einfach ins Model stopfen kann.

    Dies ist in meinem konkreten Fall allerdings nicht so einfach, da ich den entsprechenden Array Controller mit einer plist fülle, die im mainBudle liegt.

    1. Gibt es eine Erklärung, wieso Value Transformer bei Popup Buttons scheinbar ignoriert werden?

    2. Seht ihr - abgesehen von dem beschriebenen NSPopupButton-Subclass eine einfache Lösung?
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].
  • RE: NSValueTransformer + NSPopupButton

    Original von Objcler
    Ergebnis: Die Methoden meines eigenen Value Transformers werden nicht aufgerufen. Wende ich meinen Value Transformer auf das value Binding einer NSTableColumn an funktioniert alles wie erwartet. An meinem Value Transformer kann es also nicht liegen.

    Doch, kann es. Denn das value-Binding von NSTableColumn erwartet ein Objekt. Das contentValues-Binding von NSPopUpButtonCell erwartet ein Array mit Strings.

    Original von Objcler
    Ich habe brav gegoogled und das gefunden: cocoabuilder.com/archive/message/cocoa/2005/5/15/135970

    Auszug: "Unfortunately, value transformers for contentValues in popups don't have any effect - they're not even called (the same value transformer works just fine in a table view)."

    Wenn man es richtig macht, dann hat der Value Transformer auch einen Effekt. Hier mal ein kleines Demoprojekt.

    Michael
  • RE: NSValueTransformer + NSPopupButton

    Du hast ja gerade eigene Bindings implementiert. Da hst du vielleich tim Sample-Code gesehen, dass der Value-Transformer von der gebundenen Instanz manueel bedient werden muss. Das sieht aufden ersten Blick überraschend aus, ist aber klar. Es liegt nämlich garnicht auf der Hand, wann genau wie der Value-Transformer angewendet wird. Denke nur an den Hinweis von Michael: Bringt der einneues Array? Oder ändert der jedes Element im Array? Wird zuerst ein Value-Pattern erzeugt und dann transformiert oder umgekehrt?

    Das ist so flexibler, jedoch anstrengender. Schau mal, ob dein eigenes Binding Value-Transformer unterstützt.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Naja - um konkret zu werden:

    Der angesprochene NSPopupButton soll festgelegte Attribute zur Auswahl stellen, die konstant sind. Aus dem PopupButton kann man dan Dinge wie "Vorname", "Nachname", "Alter", ... auswählen. Sowas könnte man ja einfach im IB fest angeben. Das wollte ich nicht, da ich den PopupButton häufiger benötige (auf vielen Nibs). Daher habe ich den Inhalt der PopupButtons in eine plist ausgegliedert, die nur ein Array mit NSNumbers enthält. Jede NSNumber steht für ein Attribut. 0 = Vorname, 1 = Nachname, 2 = Alter. Der ValueTransformer macht dann aus diesen NSNumbers viele NSStrings, die das Attribut lokalisiert repräsentieren.

    Kommt später doch ein Attribut dazu muss ich nicht meine 20 nibs durchforsten und überall die NSPopupButtons erneuern sondern kann zentral in der plist einen neuen Eintrag erstellen und den ValueTransformer anpassen.

    Das ist doch richtig so - oder?

    Es geht in diesem Thread also nicht um mein eigenes NSView, zu dem ich die letzten Tage häufiger Fragen hatte.
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].
  • Das war mir schon klar. Ich hatte deinen View lediglich als Beispiel genommen.

    Zu deinem Vorgehen hier:
    Das ist etwas von hinten durch die Brust ins Auge. Ich würde es mutmaßlich anders machen:

    Ich würde in einer plist die englischen Werte speichern und diese dann einmalig lokalisieren. Das ganze baue ich mir als Singleton.

    Quellcode

    1. @implementation MyPopUp
    2. + (NSArray*)items {
    3. static NSArray* items = nil;
    4. if( !items ) {
    5. NSArray* nonLocalizedItems = // aus dem Bundle holen
    6. items = [NSMutableArray arrayWithCapacity:[nonLocalizedItems count]];
    7. NSEnumerator* itemsEnum = [nonLocalizedItems objectEnumerator];
    8. NSString* nonLocalizedItem;
    9. NSString* localizedItem;
    10. while( (nonLocalizedItem = [itemsEnum]) ) {
    11. // Lokalisierung für jedes Objekt
    12. localizedItem = …
    13. }
    14. items = [items copy]; // you will never go …
    15. }
    16. return tems;
    17. }
    Alles anzeigen
    Value-Transformer sind irgendwie nicht für Lokalisiserung da. Noch einfacher wäre es mutmaßlich, gleich lokalisierte Strings in das Bundle zu legen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?