Trennelement in NSPopupButton mit Bindungen

8

Der Inhalt von NSPopupButton ist an ein NSArray von Zeichenfolgen gebunden.

Wie können wir ein Trennelement über Bindungen einfügen?

Die " - " - Zeichenfolgen (wie in den alten / klassischen Tagen) funktionieren nicht, d. h. erscheinen wörtlich als " - " - Menüelement.

Gibt es eine Out-of-the-Box-Lösung mit Standard-Cocoa-Klassen und -Bindungen?

Dies sollte ein triviales Problem sein, aber ich kann keine Lösung für das Problem finden, die keine albernen Hacks wie Unterklassen NSMenu , NSPopupButton oder andere nicht-intuitive Workarounds beinhaltet.

    
ATV 05.10.2014, 11:55
quelle

5 Antworten

4

Ich konnte keine saubere Methode finden, Separatoren dynamisch zu einem Menü hinzuzufügen, wenn Sie Bindungen verwenden. Die einfachste (und am meisten wiederverwendbare) Methode, die ich gefunden habe, besteht darin, NSMenuDelegate zu verwenden, um NSMenuItems mit einem bestimmten Titel wie @"---" mit Trennelementen in der menuNeedsUpdate: -Delegatenmethode dynamisch auszutauschen.

Schritt 1: Erstellen Sie ein NSObject, das dem NSMenuDelegate-Protokoll entspricht

%Vor%

Schritt 2: Verknüpfen Sie die Dinge im Interface Builder.

Ziehen Sie ein Objekt in die Szene, die die NSPopupButton-Instanz enthält.

Setzen Sie die Klasse des Objekts auf SeparatorMenuDelegate

Drehen Sie das NSPopupButton-Steuerelement in der Dokumentgliederung und wählen Sie das darin enthaltene Menü. Setzen Sie dann den Delegaten für das Menü auf das Objekt SeparatorMenuDelegate , das Sie zuvor eingefügt haben.

Danach werden alle Elemente im Menü mit dem Titel @ "---" in Trennelemente konvertiert.

Wenn Sie mehrere NSPopupButton-Instanzen in derselben Szene haben, können Sie den Delegaten ihres Menüs auf dasselbe Objekt setzen (Sie benötigen nur ein SeparatorMenuDelegate pro Szene).

    
n.Drake 31.08.2015, 06:24
quelle
1

Hier ist n.Drakes Antwort in Swift 3.1:

%Vor%     
matt 29.04.2017 23:39
quelle
1

IMHO, die sauberste Lösung ist immer noch Unterklassen NSMenu - diese Art der Anpassung ist genau was Unterklassen ist für. Die folgende Lösung basiert auf dem, was @matt vor vielen Jahren auf Cocoabuilder und wird aktualisiert, um universeller anwendbar zu sein, einschließlich auf High Sierra.

Zuerst , definieren Sie eine "magische Zeichenfolge", die das Trennzeichen in Ihrem Code darstellt. Tun Sie dies in einer Headerdatei, die alle betroffenen Klassen importieren. In diesem Beispiel habe ich "---" gewählt, aber natürlich kann das eine beliebige Zeichenfolge sein:

%Vor%

Zweite , Unterklasse NSMenu und überschreibt die beiden Methoden zum Hinzufügen von Menüelementen, um den speziellen Trennungsfall zu behandeln:

%Vor%

Und das ist es. Setzen Sie die betroffenen Menüs im Identity Interface Builder auf die MeineMenu -Klasse und fügen Sie an dieser Stelle Trennelemente ein. Funktioniert für Menüleistenmenüs sowie für Pop-ups.

    
Uli Zappe 20.10.2017 01:28
quelle
0

[[popupButton menu] addItem: [NSMenuItem separatorItem]];

    
Borongaj 06.10.2014 10:06
quelle
0

Sehen Sie sich die Dokumentation für NSContentPlacementTagBindingOption an, die in Mac OS X 10.5 hinzugefügt wurde. Im Bindungs-Inspektor von Interface Builder ist dies für Elemente wie Popup-Menüschaltflächen verfügbar. Gehen Sie zum Abschnitt "Wertauswahl" und suchen Sie in einer beliebigen Inhaltskategorie (Inhalt, Inhaltsobjekte, Inhaltswerte) nach "Placement-Tag für Inhalt". Der Feldwert sollte eine Zahl sein, die der Tag-Nummer eines Menüelements entspricht.

Der Inhalt des gebundenen Arrays wird anstelle des Elements mit dem angegebenen Tag-Wert in das Menü eingefügt. In diesem Fall enthält das statische Menü das Trennelement und mindestens ein weiteres Element, um anzugeben, wo die Werte des Arrays liegen.

    
Kevin Grant 21.03.2015 06:47
quelle