Podejście to Używam jest podobna do powyższej odpowiedzi, ale mam wszystko połączone w jedną metodę, zamiast używać dwóch oddzielnych IBActions.
Najpierw Oświadczam następujące właściwości
@property (strong, nonatomic) NSStatusItem *statusItem;
@property (strong, nonatomic) NSEvent *popoverTransiencyMonitor;
@property (weak, nonatomic) IBOutlet NSPopover *popover;
@property (weak, nonatomic) IBOutlet NSView *popoverView;
następnie w awakeFromNib skonfigurować element paska stanu
- (void)awakeFromNib {
self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
self.statusItem.title = @"Title";
self.statusItem.highlightMode = YES;
self.statusItem.action = @selector(itemClicked:);
}
zastosowaną metodą, która jest wywoływana, gdy element Pasek stanu kliknięciu
- (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];
}];
}
}
powoduje, że popover pojawia się i zamyka również, gdy użytkownik kliknie poza widokiem.
Należy pamiętać, że w konstruktorze interfejsów należy ustawić zachowanie popover na Transient, aby popover zamknął się, gdy użytkownik kliknie element statusu.
Aby zachować spójne zachowanie z elementami statusu systemu: 'addGlobalMonitorForEventsMatchingMask: NSLeftMouseDownMask | NSRightMouseDownMask' - tak, że kliknięcie prawym przyciskiem myszy zamyka również popover. – inket