2012-01-29 21 views
17

में एनएसपीओपीओवर ट्रांजिसी है, मैं एक ऐप बना रहा हूं जो स्टेटस बार में रहता है। जब स्थिति आइटम क्लिक किया जाता है, तो एनएसपीओवर पॉप अप हो जाता है।पॉपओवर स्टेटस बार

यह इस तरह दिखता है:

enter image description here

यहाँ समस्या है: मैं इसे "क्षणिक" होना चाहता हूँ, वह यह है कि अगर मैं पॉपओवर के बाहर कहीं भी क्लिक करें, यह बंद हो जाएगा। और जब NSPopoverBehaviorTransient विंडो में पॉपओवर होने पर ठीक काम करता है, यह स्थिति बार में होने पर काम नहीं करता है।

मैं इस तरह के व्यवहार को कैसे लागू कर सकता हूं?

उत्तर

28

यह पता चला आसान होने के लिए:

- (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) 
} 

क्या आसान नहीं था, हालांकि, बुरा मुद्दों (NSStatusItem के बाहर एक पॉपओवर पॉप होने के साथ देखते हैं कि इच्छानुसार इसे व्यवहार नहीं किया है जब मिशन नियंत्रण लागू किया गया था या एक पूर्ण स्क्रीन खिड़की पर स्थान स्विच किया गया था)। मुझे एक कस्टम विंडो को कार्यान्वित करना था जो हमेशा NSStatusItem के ऊपर तैरता है और एक पूर्ण-स्क्रीन विंडो आदि में स्विच करने के साथ सौदा करता है। यह आसान लग रहा था, लेकिन स्पष्ट रूप से स्थिति आइटम ऐसी किसी चीज़ के लिए डिज़ाइन नहीं किए गए थे;)

+5

सिस्टम स्थिति आइटम के साथ लगातार व्यवहार के लिए: 'addGlobalMonitorForEventsMatchingMask: NSLeftMouseDownMask | NSRightMouseDownMask' - ताकि सही क्लिक पॉपओवर को बंद कर दें। – inket

7

दृष्टिकोण मैं उपर्युक्त उत्तर के समान है, सिवाय इसके कि मेरे पास दो अलग-अलग 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]; 
     }]; 
    } 
} 

जो पॉपओवर प्रकट करता है और उपयोगकर्ता क्लिक करता है तो बंद भी करता है दृश्य के बाहर।

ध्यान दें कि इंटरफ़ेस बिल्डर में आपको पॉपओवर का व्यवहार क्षणिक पर सेट करना होगा ताकि जब उपयोगकर्ता स्थिति आइटम पर क्लिक करता है तो पॉपओवर बंद हो जाएगा।

संबंधित मुद्दे