2009-06-13 7 views
2

Ich habe einen NSPopUpButton, der das NSMenu für ein Statuselement mit einer benutzerdefinierten Ansicht bereitstellt. Die Popup-Schaltfläche zeigt eine Liste von Links an. Wenn der Benutzer einen Link aus der Liste auswählt, wird der Link im Browser des Benutzers angezeigt (im Hintergrund).Wie kann ich einen NSPopUpButton geöffnet lassen, nachdem der Benutzer einen Menüeintrag ausgewählt hat?

Natürlich schließt das Menü jedes Mal, wenn der Benutzer einen Link auswählt.

Ich möchte das ändern: Ich möchte das Menü geöffnet bleiben, während der Benutzer auf verschiedene Links klickt, die alle im Hintergrund geöffnet werden können. Das Menü kann dann verschwinden, wenn der Benutzer auf eine andere Stelle klickt.

Wie kann dies erreicht werden? Sollte ich NSMenuItem ableiten und die Mausklicks irgendwie abfangen? Overlay ein transparentes NSView auf dem Popup-Menü und wiederum die Klicks irgendwie abfangen? Ich mache diese Vorschläge munter, aber ich hätte Schwierigkeiten, diese beiden zu implementieren ... Zeiger auf die richtigen Methoden zum Überschreiben wären willkommen.

Antwort

0

Normalerweise sollten Sie ein Steuerelement nicht zu weit nach seiner ursprünglichen Absicht biegen. Benutzer erwarten, dass Popup-Schaltflächen geschlossen werden, nachdem sie eine Auswahl getroffen haben. Ich glaube nicht, dass Sie NSPopUpButtonCell dazu zwingen sollten oder können, sich auf diese Weise zu verhalten. Wenn Sie dies tun, werden Sie das Steuerelement so stark unterklassifizieren und modifizieren, dass es sich mit einer zukünftigen Version von Mac OS X ändert/bricht. Sie müssen sich auch Gedanken über das Usability-Problem von Benutzern machen, die denken, dass das Menü nach dem Erstellen geschlossen wird eine Auswahl.

Sie könnten in Erwägung ziehen, Ihre eigene Unterklasse von NSView so zu schreiben, dass sie wie die Menüschaltfläche funktioniert, die Sie beschreiben. Nachdem der Benutzer auf die Schaltfläche geklickt hat. Sie möchten ein neues NSWindow ohne Rahmen erstellen, indem Sie NSBorderlessWindowMask als Stilmaske verwenden. Die Inhaltsansicht dieses Fensters sollte eine andere benutzerdefinierte Ansicht von Ihnen sein, in die Sie die Menüauswahl implementieren.

+0

Danke für den Kommentar. Ich würde sicherlich überlegen, meine eigene Unterklasse von NSView zu schreiben. Es verhält sich jedoch wie ein königlicher Schmerz, um sich mit allen Untermenüs, Bildern, Ein/Aus-Zuständen usw., die mit der NSPopUpButtonCell/NSMenu-Kombination geliefert werden, kostenlos zu befassen. Also ... Ich weiß, dass das Schreiben meiner eigenen NSView eine Möglichkeit ist, dies zu tun, aber ich denke ehrlich gesagt, wenn ich NSPopUpButton exakt imitiere, aber nur das Verhalten ändere, das ich ändern möchte - dann könnte ich genauso gut weitermachen und "beuge [die] Kontrolle zu weit hinter seiner ursprünglichen Absicht"! Ich meine, das Ergebnis ist dasselbe, so dass es sinnlos erscheint, auf einer Zeremonie zu stehen. – Dennis

1

Anstatt ein Menü zu verwenden, könnte man eine zusammenklappbare Box verwenden. Ich habe das in vielen Apps gesehen (auch von Apple bereitgestellt)), also denke ich, das ist der empfohlene Stilführer für Mehrfachauswahl. Die reduzierbare Box wird erweitert, wenn Sie auf die Schaltfläche zum Anzeigen klicken, und es werden alle gewünschten Elemente freigelassen - wie eine Tabellenansicht mit Kontrollkästchen. Ansichten unter diesem Feld müssen in diesem Fall nach unten gehen, um die Box nicht zu stören.

before

enter image description here

wieder einem Klick auf den Button Offenbarung wird die Box zurück zu seinem Ursprung schrumpfen. Der Effekt ähnelt dem Schließen eines Menüs.