दृष्टिकोण मैं उपर्युक्त उत्तर के समान है, सिवाय इसके कि मेरे पास दो अलग-अलग IBActions का उपयोग करने के बजाय सब कुछ एक विधि में संयुक्त है।
सबसे पहले, मैं घोषणा निम्नलिखित गुण
@property (strong, nonatomic) NSStatusItem *statusItem;
@property (strong, nonatomic) NSEvent *popoverTransiencyMonitor;
@property (weak, nonatomic) IBOutlet NSPopover *popover;
@property (weak, nonatomic) IBOutlet NSView *popoverView;
तो awakeFromNib में मैं स्थिति पट्टी आइटम
- (void)awakeFromNib {
self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
self.statusItem.title = @"Title";
self.statusItem.highlightMode = YES;
self.statusItem.action = @selector(itemClicked:);
}
विधि यह है कि जब स्थिति पट्टी आइटम
क्लिक किया जाता है कहा जाता है के बाद सेट
- (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];
}];
}
}
जो पॉपओवर प्रकट करता है और उपयोगकर्ता क्लिक करता है तो बंद भी करता है दृश्य के बाहर।
ध्यान दें कि इंटरफ़ेस बिल्डर में आपको पॉपओवर का व्यवहार क्षणिक पर सेट करना होगा ताकि जब उपयोगकर्ता स्थिति आइटम पर क्लिक करता है तो पॉपओवर बंद हो जाएगा।
सिस्टम स्थिति आइटम के साथ लगातार व्यवहार के लिए: 'addGlobalMonitorForEventsMatchingMask: NSLeftMouseDownMask | NSRightMouseDownMask' - ताकि सही क्लिक पॉपओवर को बंद कर दें। – inket