ventanas ventana son que permitir internet habilitar extension emergentes emergente chrome bloquear cocoa osx-lion statusbar popover nsstatusbar

cocoa - son - ventana emergente whatsapp



Transitoria NSPopover cuando la ventana emergente está en la barra de estado (2)

El enfoque que utilizo es similar al de la respuesta anterior, excepto que tengo todo combinado en un solo método en lugar de usar dos IBActions por separado.

Primero, declaro las siguientes propiedades.

@property (strong, nonatomic) NSStatusItem *statusItem; @property (strong, nonatomic) NSEvent *popoverTransiencyMonitor; @property (weak, nonatomic) IBOutlet NSPopover *popover; @property (weak, nonatomic) IBOutlet NSView *popoverView;

luego en awakeFromNib configuré el elemento de la barra de estado

- (void)awakeFromNib { self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength]; self.statusItem.title = @"Title"; self.statusItem.highlightMode = YES; self.statusItem.action = @selector(itemClicked:); }

seguido del método al que se llama cuando se hace clic en el elemento de la barra de estado

- (void)itemClicked:(id)sender { [[self popover] showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMinYEdge]; if (self.popoverTransiencyMonitor == nil) { self.popoverTransiencyMonitor = [NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseDownMask | NSRightMouseDownMask | NSKeyUpMask) handler:^(NSEvent* event) { [NSEvent removeMonitor:self.popoverTransiencyMonitor]; self.popoverTransiencyMonitor = nil; [self.popover close]; }]; } }

lo que hace que aparezca la ventana emergente y también se cierra cuando el usuario hace clic fuera de la vista.

Tenga en cuenta que en Interface Builder debe configurar el comportamiento de la ventana emergente en Transitorio para que la ventana emergente se cierre cuando el usuario haga clic en el elemento de estado.

Estoy haciendo una aplicación que vive en la barra de estado. Cuando se hace clic en el elemento de estado, aparece NSPopover.

Se parece a esto:

Aquí está el problema: quiero que sea "transitorio", es decir, si hago clic en cualquier lugar fuera de la ventana emergente, se cerrará. Y mientras NSPopoverBehaviorTransient funciona bien cuando la ventana emergente está en una ventana, no funciona cuando está en la barra de estado.

¿Cómo puedo implementar tal comportamiento yo mismo?


Resultó ser fácil:

- (IBAction)openPopover:(id)sender { // (open popover) if(popoverTransiencyMonitor == nil) { popoverTransiencyMonitor = [NSEvent addGlobalMonitorForEventsMatchingMask:NSLeftMouseDownMask|NSRightMouseDownMask handler:^(NSEvent* event) { [self closePopover:sender]; }]; } } - (IBAction)closePopover:(id)sender { if(popoverTransiencyMonitor) { [NSEvent removeMonitor:popoverTransiencyMonitor]; popoverTransiencyMonitor = nil; } // (close popover) }

Lo que no fue fácil, sin embargo, es que hay problemas desagradables al tener una ventana emergente emergente de NSStatusItem (no se comportó como se desea cuando se invoca el Control de la Misión o se cambia el espacio a una ventana de pantalla completa). Tuve que implementar una ventana personalizada que siempre flota sobre el NSStatusItem y se ocupa de cambiar a una ventana de pantalla completa, etc. Parecía fácil, pero claramente los elementos de estado no estaban diseñados para algo así;)