Menü NSSegmentedControl anzeigen, wenn Segment geklickt wurde, obwohl eine Aktion festgelegt wurde

7

Ich habe ein NSSegmentedControl auf meiner Benutzeroberfläche mit 4 Tasten. Das Steuerelement ist mit einer Methode verbunden, die abhängig davon, auf welches Segment geklickt wird, verschiedene Methoden aufruft:

%Vor%

In der wakeFromNib-Methode wurde an das Segment 4 ein Menü angehängt. Ich möchte, dass dieses Menü angezeigt wird, wenn der Benutzer auf das Segment klickt. An dieser Stelle wird es nur fallen, wenn der Benutzer auf & amp; hält auf der Speisekarte fest. Aus meiner Online-Recherche ergibt sich dies aufgrund der damit verbundenen Handlung.

Ich arbeite gerade daran herum, indem ich Code benutze, um den Ursprungspunkt des Segment-Steuerelements zu erhalten und das Kontextmenü mit NSMenu popUpContextMenu:withEvent:forView aufzurufen, aber das ist ziemlich hacktastisch und sieht schlecht aus im Vergleich zum Standardverhalten des Menü Dropdown-Menü unter der segmentierten Kontrollzelle.

Gibt es einen Weg, wie ich das Menü nach einem einzigen Klick herunterklappen kann, anstatt die Hacking-Kontext-Menü-Sache zu machen?

    
Justin Williams 29.07.2009, 23:46
quelle

4 Antworten

3

Ich bin mir nicht sicher, ob es eine eingebaute Methode dafür gibt (obwohl es wirklich ein eklatantes Loch in der NSSegmentedControl-API ist).

Ich empfehle, das zu tun, was Sie machen, indem Sie das Kontextmenü aufrufen. Anstatt jedoch nur den Ursprung des segmentierten Steuerelements zu verwenden, können Sie ihn wie folgt direkt unter dem Segment positionieren:

%Vor%

Es ist nicht perfekt oder ideal, aber es sollte den Job erledigen und das Aussehen / Verhalten geben, das Ihre Benutzer erwarten.

(als Nebenbedingung benötigt NSSegmentedControl wirklich eine -rectForSegment: -Methode)

    
Matt Ball 29.07.2009, 23:54
quelle
14

Unterklasse NSSegmentedCell, überschreiben Sie die Methode unten und ersetzen Sie die Zellenklasse in IB. (Erfordert keine privaten APIs).

%Vor%     
J Hoover 27.07.2010 17:43
quelle
3

Dies ist die Swift-Version der Antwort von J Hoover und der Mod von Adam Treble. Der Override war nicht so intuitiv wie ich es mir vorgestellt hatte, also wird dies hoffentlich jemand anderem helfen.

%Vor%     
nspire 27.04.2015 14:44
quelle
2

widthForSegment: gibt null zurück, wenn das Segment automatisch skaliert. Wenn Sie nicht über nicht dokumentierte APIs besorgt sind, gibt es ein rectForSegment:

  • (NSRect) rectForSegment: (NSInteger) Segment              inFrame: (NSRect) frame;

Aber um die ursprüngliche Frage zu beantworten, ist es einfacher, das Menü sofort aufzurufen, indem Sie NSSegmentedCell ableiten und 0 für (wieder undokumentiert) zurückgeben.

  • (double) _menuDelayTimeForSegment: (NSInteger) Segment;
Lee Ann Rucker 05.05.2010 22:42
quelle

Tags und Links