Programáticamente instancias de un NSPopUpButtonCell en Cocoa OSX
-
20-09-2019 - |
Pregunta
Tengo una interfaz gráfica OpenGL y tengo que tener un menú emergente que se llamará cuando esto un determinado botón se pulsa en mi pantalla OpenGL. Quiero mostrar un menú similar a la que aparece cuando se pulsa un NSPopUPButton pero no puede usar el botón de cacao en sí. Parece que la mejor manera de lograr esto es utilizar el NSPopupButtonCell. No puedo publicar mi código aquí porque estoy escribiendo el código en Lisp y acceder al cacao a través de un puente de C objetiva pero yo sólo quería ver si el siguiente código pseduo parece que debería mostrar el menú o si hay una falla obvia en mi lógica:
• 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.
Ninguno de estos métodos tuvieron éxito en conseguir cualquier tipo de menú que se mostrará. ¿Hay alguna otra manera de hacer estallar programtically el menú de contenido en la célula?
Solución
Creo que busca el método trackMouse:inRect:ofView:untilMouseUp:
de NSCell
[theCell trackMouse:[NSApp currentEvent] inRect:NSZeroRect ofView:theView untilMouseUp:YES];
Otros consejos
Creo que sería mejor usar un NSMenu
simple y llamando +[NSMenu popUpContextMenu:withEvent:forView:]
. Si está destinada a una audiencia sólo el 10,6 y más tarde, es posible que también echa un vistazo a -[NSMenu popUpMenuPositioningItem:atLocation:inView:]
, que le da un poco más de control sobre el posicionamiento del menú. Sólo aplicar mouseDown:
en su opinión, la construcción de un menú (o cargarla desde un archivo de mina), y mostrarlo, y NSMenu
debe tener cuidado de todos los detalles de allí. Sólo asegúrese de que el objetivo y la acción para cada NSMenuItem
se establece de modo que el método se llama a la acción correctamente cuando se selecciona un elemento.