Programatically un'istanza di un NSPopUpButtonCell a Cocoa OSX
-
20-09-2019 - |
Domanda
Ho un'interfaccia openGL GUI e ho bisogno di avere un menu a comparsa che verrà chiamato quando si preme questo tasto in un certo mio display OpenGL. Voglio visualizzare un menu simile a quello che si apre quando si preme un NSPopUPButton ma non è possibile utilizzare il pulsante di cacao in sé. Sembra che il modo migliore per farlo è quello di utilizzare il NSPopupButtonCell. Non riesco a postare il mio codice qui perché sto scrivendo il codice in Lisp e l'accesso al cacao attraverso un ponte di obiettivo C, ma volevo solo vedere se il seguente codice pseduo sembra che dovrebbe visualizzare il menu o se c'è un difetto evidente nel mio logica:
• Pseudo Code for function that is called when button is pressed:
• Initialize an NSPopUpButtonCell Using initTextCell: "test" pullsDown: NO
• allocate an NSMenu using alloc
• add two menu items using addItem:
• set the menu of the popUpButtonCell to be the menu that was just allocated using setMenu:
• Next I tried two methods to try and get the menu to actually be displayed,
first I tried using drawWithFrame:inView: and when that did not work I also tried
using drawBezelWithFrame:inView: eventhough the docs said not to use but I just
tried it out of desperation.
• finally, when the draw methods did not work I tried using performClick: on the
popupButtonCell to try and simulate the click.
Nessuno di questi metodi erano riusciti a ottenere qualsiasi tipo di menu da visualizzare. C'è qualche altro modo per far apparire modo pianificato il menu contenuto nella cella?
Soluzione
Penso che si sta cercando il metodo trackMouse:inRect:ofView:untilMouseUp:
di NSCell
[theCell trackMouse:[NSApp currentEvent] inRect:NSZeroRect ofView:theView untilMouseUp:YES];
Altri suggerimenti
Credo che sarebbe meglio utilizzare un NSMenu
pianura e chiamando +[NSMenu popUpContextMenu:withEvent:forView:]
. Se stai rivolte solo il 10,6 e più tardi, si potrebbe anche verificare -[NSMenu popUpMenuPositioningItem:atLocation:inView:]
, che vi dà un po 'più di controllo sul posizionamento del menu. Basta implementare mouseDown:
nella vista, costruire un menu (o caricarlo da un file NIB), e visualizzarlo, e NSMenu
dovrebbe prendersi cura di tutti i dettagli da lì. Basta fare in modo che l'obiettivo e l'azione per ogni NSMenuItem
è impostato in modo che il metodo di azione viene chiamato correttamente quando si seleziona una voce.