¿Cómo debo hacerlo?

Yo estaba pensando en…

[NSMenu popUpContextMenu:menu withEvent:event forView:(NSButton *)sender];
InformationsquelleAutor Dr.Kameleon | 2012-03-15

6 Comentarios

  1. 29

    Sí.

    Sobre el botón de la llamada acción

    [NSMenu popUpContextMenu:menu withEvent:event forView:(NSButton *)sender];

    donde

    • menu : menú que desea mostrar
    • sender : botón se hizo clic
    • event : un nuevo NSEvent crear

    Cuando se crea el nuevo NSEvent, especifique la ubicación donde desea que aparezca el menú emergente que se muestra.

    • Trató de eso, pero el «pop-up» en el menú va un poco por todo el lugar. Yo quiero que aparecen justo DEBAJO de la tecla (por ejemplo, como la «Nueva Pestaña»,»Nueva Ventana»,etc menú de Google Chrome), pero esto parece demasiado… de alta…
    • Ya. Como he dicho anteriormente, puede especificar la ubicación del menú emergente (de donde debe ser demostrado), mientras que la creación del evento.
    • OK. Me lo imaginé. Voy a publicar el total de la respuesta a mi pregunta…
    • Puede utilizar [[NSApplication sharedApplication] currentEvent] para el evento.
    • [auto.myButton sendActionOn:NSLeftMouseDownMask] hará que este desencadenador en el ratón hacia abajo.
    • Me gustaría recomendar -[NSMenu popUp:...] en lugar del método de la clase. De este modo, se sitúa en relación con su botón, incluso si el uso de un atajo de teclado para ella.

  2. 11

    Swift versión de aceptado respuesta

    @IBAction func actionOccurred(sender: NSButton) {
        if let event = NSApplication.sharedApplication().currentEvent {
            NSMenu.popUpContextMenu(sender.menu!, withEvent: event, forView: sender)
        }
    }
  3. 6

    Como he comentado me parece la ButtonMadness ejemplo, menos que perfecto.
    A mi parece que la aplicación funcione mejor. El menú se muestra en el ratón hacia abajo, el botón se mantiene deprimido el recinto del hotel, de la posición del menú puede ser especificado y el menú es despedido sin posterior espurio de la pantalla.

    Para ser honesto NSPopupButton es la mejor elección en la mayoría de situaciones. Yo uso este código, principalmente debido a la comodidad de tener una clase para los botones y las ventanas emergentes y debido a que el menú no contiene el control emergente de la imagen y el título. Me carga el menú de una separada de la plumilla y reutilizar en otros lugares de la aplicación, según sea necesario.

    Nota que es trivial para añadir soporte adicional para decir una ventana emergente así como de menú.

    NSButton subclass:
    
    - (void)mouseDown:(NSEvent *)theEvent {
    
        //if a menu is defined let the cell handle its display
        if (self.menu) {
            if ([theEvent type] == NSLeftMouseDown) {
                [[self cell] setMenu:[self menu]];
            } else {
                [[self cell] setMenu:nil];
            }
        }
    
        [super mouseDown:theEvent];
    }
    
    NSButtonCell subclass:
    
    - (BOOL)trackMouse:(NSEvent *)event inRect:(NSRect)cellFrame ofView:(NSView *)controlView untilMouseUp:(BOOL)untilMouseUp
    {
        //if menu defined show on left mouse
        if ([event type] == NSLeftMouseDown && [self menu]) {
    
            NSPoint result = [controlView convertPoint:NSMakePoint(NSMidX(cellFrame), NSMidY(cellFrame)) toView:nil];
    
            NSEvent *newEvent = [NSEvent mouseEventWithType: [event type]
                                                   location: result
                                              modifierFlags: [event modifierFlags]
                                                  timestamp: [event timestamp]
                                               windowNumber: [event windowNumber]
                                                    context: [event context]
                                                eventNumber: [event eventNumber]
                                                 clickCount: [event clickCount]
                                                   pressure: [event pressure]];
    
            //need to generate a new event otherwise selection of button
            //after menu display fails
            [NSMenu popUpContextMenu:[self menu] withEvent:newEvent forView:controlView];
    
            return YES;
        }
    
        return [super trackMouse:event inRect:cellFrame ofView:controlView untilMouseUp:untilMouseUp];
    }
    • Funciona muy bien para mí. He encontrado que puedo configurar el menú directamente sobre la célula y la no necesidad de la subclase el botón. Me estoy perdiendo alguna razón esto sería un problema?
  4. 6

    Recientemente, yo estaba tratando de implementarlo y me vine, como creo, con una solución más simple

    -(IBAction)buttonClick:(id)sender {
        NSButton * b = (NSButton*)sender;
        NSPoint l = [ self.window convertBaseToScreen:b.frame.origin ];
    
        [ self.menu popUpMenuPositioningItem:nil atLocation:l inView:nil ];
    }

    Actualización

    convertBaseToScreen es obsoleta a partir de 10.7, en lugar de utilizar convertRectToScreen de la siguiente manera:

    NSPoint l = [self.window convertRectToScreen:b.frame].origin; 
    • Bueno un simple, esto funcionó bien.
    • convertBaseToScreen está en desuso desde 10_7
    • Con guión gráfico (en un ViewController) no parecen funcionar. He intentado sin éxito: NSPoint point = [[self.view window] convertRectToScreen:((NSButton*)sender).frame].origin; alguna idea?
    • Compruebe que ha configurado todo correctamente, yo.e su acción está conectado y se llama, sí.el menú no es nada, yo.vista.la ventana no es nil. ¿Qué valor(punto) qué se obtiene ?
  5. 4

    Mediante un menú contextual en la llamada acción no es una gran forma de hacerlo porque el menú no aparece hasta mouseUp – usted no recibe el hold & arrastre el comportamiento del menú. Apple ButtonMadness ejemplo, se muestra cómo realmente hacer esto en una subclase de NSButton, ver DropDownButton. https://developer.apple.com/library/mac/samplecode/ButtonMadness/Introduction/Intro.html

    Resumir que la subclase: crear un NSPopUpButtonCell con pullsDown establecer a SÍ & preferredEdge a NSMaxYEdge, copie el menú para agregar un espacio en blanco la parte superior del elemento y establézcalo como que la celda del menú, en mouseDown llamada [thePopUpCell performClickWithFrame:auto.límites inView:auto] y ajustar el auto.needsDisplay

    • En 10.8 por lo menos el DropDownButton código es defectuoso. Para resaltar el problema de construir la ButtonMadness de la muestra y haga clic en el DropDownButton. El menú de la pantalla – no seleccionar un elemento. Ahora haga clic en el botón de Radio 2 – el menú está oculto, pero la radio elemento no está seleccionado. Así que haga clic de nuevo, el menú se muestra de nuevo. otro clic y se esconde etc.
    • Por qué usted necesita para agregar el elemento en blanco? Agradezco que hacer (no agregar trunca el menú), pero no puedo averiguar por qué
  6. 1

    Hacer como que.

        -(IBAction)onClickSourceAdd:(id)sender {
           NSMenu *mainMenu = [NSApp mainMenu];
           NSMenu *sourceMenu = [[mainMenu itemAtIndex:2] submenu];
           NSMenu *addMenu = [[sourceMenu itemAtIndex:0] submenu];
           [NSMenu popUpContextMenu:addMenu 
                   withEvent:[NSApp currentEvent] 
                   forView:(NSButton *)sender]; 
         }

Dejar respuesta

Please enter your comment!
Please enter your name here