2012-03-15 13 views
13

से पॉपअप मेनू कार्यान्वयन मुझे इसके बारे में कैसे जाना चाहिए?एनएसबटन

मैं के बारे में सोच रहा था ...

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

उत्तर

22

हाँ। मेनू आप इस दिखाना चाहते हैं - - बटन आप क्लिक

बटन कार्रवाई कॉल

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

जहां मेनू पर

। इवेंट - आप एक नया ईवेंट बना सकते हैं और जब आप पॉपअप मेनू को दिखाना चाहते हैं, वहां स्थान निर्दिष्ट करते समय।

+0

की कोशिश की है कि लेकिन "पॉप अप" मेनू हर जगह एक सा हो जाता है। मैं इसे बटन के ठीक नीचे दिखाना चाहता हूं (उदा। Google क्रोम में "नया टैब", "नई विंडो", आदि मेनू की तरह), लेकिन यह एक तरीका भी दिखाई देता है ... उच्च ... –

+1

हां। जैसा कि मैंने ऊपर बताया है, आप ईवेंट बनाते समय पॉपअप मेनू (जहां इसे दिखाया जाना चाहिए) का स्थान निर्दिष्ट कर सकते हैं। –

+0

ठीक है। मैं यह समझ गया। मैं अपने एक प्रश्न का पूरा उत्तर पोस्ट करूंगा ... –

4

एक्शन कॉल पर एक संदर्भ मेनू का उपयोग करना ऐसा करने का एक शानदार तरीका नहीं है क्योंकि मेनू माउसअप तक नहीं दिखाता है - आपको पकड़ & ड्रैग मेनू व्यवहार नहीं मिलता है। ऐप्पल का बटन मैडनेस नमूना दिखाता है कि एनएसबटन के उप-वर्ग में वास्तव में ऐसा कैसे करें, ड्रॉपडाउन बटन देखें। https://developer.apple.com/library/mac/samplecode/ButtonMadness/Introduction/Intro.html

का सारांश है कि उपवर्ग: self.bounds ध्यान में रखते हुए: pullsDown के साथ एक NSPopUpButtonCell बनाने NSMaxYEdge को हां & preferredEdge करने के लिए सेट, एक खाली शीर्ष आइटम जोड़ सकते हैं और है कि सेल के मेनू के रूप में सेट, mousedown कॉल [thePopUpCell performClickWithFrame पर करने के लिए अपने मेनू कॉपी : self] और self.needs सेट करें

+0

10.8 पर कम से कम DropDown बटन कोड दोषपूर्ण है। समस्या को हाइलाइट करने के लिए बटनमैडनेस नमूना बनाएं और ड्रॉपडाउन बटन पर क्लिक करें। मेनू प्रदर्शित होगा - एक आइटम का चयन न करें। अब रेडियो बटन 2 पर क्लिक करें - मेनू छुपा हुआ है लेकिन रेडियो आइटम का चयन नहीं किया गया है। तो फिर से क्लिक करें, मेनू फिर से प्रदर्शित करता है। एक और क्लिक और यह छुपाता है आदि –

+2

आपको खाली आइटम जोड़ने की आवश्यकता क्यों है? मैं सराहना करता हूं कि आप ऐसा करते हैं (इसे मेनू में छंटनी करने में विफल) लेकिन मैं काम नहीं कर सकता क्यों –

5

जैसा कि मैंने टिप्पणी की है मुझे बटन मैडनेस उदाहरण सही से कम मिलता है। मेरा कार्यान्वयन बेहतर काम करता प्रतीत होता है। मेनू माउस पर दिखाया गया है, बटन पूरे समय उदास रहता है, मेनू स्थिति निर्दिष्ट की जा सकती है और मेनू को बाद में नकली प्रदर्शन के बिना खारिज कर दिया जाता है।

ईमानदार होने के लिए एनएसपीओप बटन कई स्थितियों में बेहतर विकल्प है। मैं मुख्य रूप से बटन और पॉपअप के लिए एक वर्ग रखने की सुविधा के कारण इस कोड का उपयोग करता हूं और क्योंकि मेनू में पॉपअप नियंत्रण छवि और शीर्षक नहीं होता है। मैं मेनू को एक अलग निब से लोड करता हूं और इसे आवश्यकतानुसार ऐप में कहीं और उपयोग करता हूं।

ध्यान दें कि एक पॉपओवर और मेनू के लिए अतिरिक्त समर्थन जोड़ने के लिए यह छोटा है।

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]; 
} 
+0

मेरे लिए बहुत अच्छा काम करता है। मैंने पाया है कि मैं सीधे सेल पर मेनू सेट कर सकता हूं और बटन को सबक्लस करने की आवश्यकता नहीं है। क्या मुझे कुछ कारण याद आ रहा है यह एक समस्या होगी? –

4

हाल ही में, मैं इसे लागू करने के लिए, के रूप में मुझे लगता है, के बजाय कोशिश कर रहा था और एक सरल समाधान

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

    [ self.menu popUpMenuPositioningItem:nil atLocation:l inView:nil ]; 
} 

अद्यतन

convertBaseToScreen 10,7 से शुरू बहिष्कृत हो गई है साथ मैं आया यह convertRectToScreen का उपयोग निम्न तरीके से करता है:

NSPoint l = [self.window convertRectToScreen:b.frame].origin; 
+0

अच्छा एक अच्छा, यह अच्छी तरह से काम किया। –

+1

कन्वर्टबेससेस्क्रीन को 10_7 –

+0

के बाद हटा दिया गया है स्टोरीबोर्ड (व्यू कंट्रोलर में) के साथ यह काम नहीं कर रहा है। मैंने सफलता के बिना प्रयास किया: 'एनएसपीओइंट पॉइंट = [[self.view विंडो] कन्वर्टरटेक्टस्क्रीन: ((एनएसबटन *) प्रेषक) .frame] .origin; 'कुछ विचार? – Joannes

5

स्वीकार किए जाते हैं जवाब की स्विफ्ट संस्करण

@IBAction func actionOccurred(sender: NSButton) { 
    if let event = NSApplication.sharedApplication().currentEvent { 
     NSMenu.popUpContextMenu(sender.menu!, withEvent: event, forView: sender) 
    } 
} 
संबंधित मुद्दे