Pregunta

Estoy tratando de mostrar un menú pop-up de abajo del ratón sobre un botón. El botón debe aparecer mientras presiona hacia abajo el ratón y el ser "no presionado" en ratón hacia arriba independientemente de cualquiera de los elemento de menú sido seleccionado. Al igual que en el botón Expose / panel de Preferencia del espacio "+" para añadir la aplicación.

Hasta ahora he intentado 3 métodos:

  1. Enviado acción cuando el botón está clic. Pero aquí el menú pop-up aparece en ratón hacia arriba en lugar de hacia abajo del ratón

  2. Subclase NSButton y sobrescribir mouseDown :. El menú pop-up aparece abajo del ratón, puedo seleccionar cualquiera de la opción de menú. Pero cuando el menú pop-up se ha ido, apareció el botón presionado. De ahí que necesito para hacer clic una vez más a la "prensa de la ONU" el botón antes de que pueda obtener la misma acción de nuevo.

  3. NSEvent addLocalMonitorForEventsMatchingMask. Un comportamiento similar a 2.

Cualquier sugerencia? Creo que el método 2 o 3 es la manera correcta, sólo tiene que "prensa de la ONU" el botón del ratón hacia arriba.

¿Fue útil?

Solución

Como Pedro mencionó, se puede usar un NSPopUpButton. Lo que no es obvio es que se puede configurar el botón de estilo, imagen, título, etc. del mismo modo que con un NSButton.

Otros consejos

Muy a un viejo hilo. Pero es el problema que enfrenta hace poco tiempo, por lo que si se me permite contribuir ...

En mi caso usando NSPopupButton no era una opción. Debido NSPopupButton crea su propia NSMenu que no necesito (y no sé cómo hacer que desaparezca).

Y he encontrado otra manera. Hay una posibilidad de cambiar el comportamiento predeterminado de subclases NSButton sin ella. Sólo uso el método de la clase -sendActionOn: NSControl (en algún lugar -awakeFromNib):

[_myButton sendActionOn:NSEventMaskLeftMouseDown];

Ahora la acción desde el botón se envía el evento mouseDown. Espero que esto ayude.

Swift "Sintaxis"

myButton.sendAction(on: .leftMouseDown)

Como alternativa:

Subclase NSButton:

class ButtonDown: NSButton {
    override func awakeFromNib() {
        super.awakeFromNib()

        self.sendAction(on: .leftMouseDown)
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top