2009-09-08 10 views
7

मेरे पास popUpStatusItemMenu का उपयोग कर NSStatusItem से एक NSMenu पॉपिंग है। ये एनएसएमएनयूइटम विभिन्न लिंक का एक गुच्छा दिखाते हैं, और प्रत्येक एक सेटएक्शन से जुड़ा होता है: ओपनलिंक में: लक्ष्य की विधि। यह व्यवस्था लंबे समय से ठीक काम कर रही है। उपयोगकर्ता मेनू से एक लिंक चुनता है और ओपनलिंक: विधि उसके साथ सौदा करता है।NSMenuItem में कस्टम NSView माउस ईवेंट प्राप्त नहीं कर रहा है

दुर्भाग्यवश, मैंने हाल ही में एनएसएनएनयूइटम के सेट व्यू का उपयोग करने के साथ प्रयोग करने का निर्णय लिया: विधि एक अच्छा/स्लीकर इंटरफेस प्रदान करने के लिए। असल में, मैंने शीर्षक सेट करना बंद कर दिया, NSMenuItem बनाया, और उसके बाद सेट व्यू का उपयोग किया: कस्टम दृश्य प्रदर्शित करने के लिए। यह पूरी तरह से काम करता है, मेनू आइटम बहुत अच्छे लगते हैं और मेरा कस्टम व्यू प्रदर्शित होता है।

हालांकि, उपयोगकर्ता एक मेनू आइटम और विज्ञप्ति माउस, कार्रवाई अब काम नहीं करता चुनता है जब (अर्थात, openLink: कहा जाता है नहीं है)। अगर मैं बस सेटव्यू: कॉल पर टिप्पणी करता हूं, तो क्रियाएं फिर से काम करती हैं (बेशक, मेनू आइटम रिक्त हैं, लेकिन कार्रवाई ठीक से निष्पादित की जाती है)। मेरा पहला सवाल, फिर, एक दृश्य स्थापित करने से एनएसएमएनयूइटम की कार्रवाई टूट जाती है।

कोई बात नहीं, मैंने सोचा, मैं इसे अपने कस्टम दृश्य में mouseUp घटना का पता लगाने और वहाँ से मेरी कार्रवाई विधि को फोन करके ठीक कर देंगे। मैंने इस विधि को अपने कस्टम व्यू में जोड़ा:

- (void)mouseUp:(NSEvent *)theEvent { 
    NSLog(@"in mouseUp"); 
    } 

कोई पासा नहीं! इस विधि को कभी नहीं कहा जाता है। , हालांकि घटनाओं:

मैं ट्रैकिंग rects सेट और mouseEntered प्राप्त कर सकते हैं। इस प्रकार मैं अपने mouseEntered दिनचर्या में कुछ परीक्षण डाल:

not ignoring mouse events 
canBecomeKeyWindow 
not isKeyWindow 

इस समस्या है:

if ([[self window] ignoresMouseEvents]) { NSLog(@"ignoring mouse events"); } 
else { NSLog(@"not ignoring mouse events"); } 
if ([[self window] canBecomeKeyWindow]) { dNSLog((@"canBecomeKeyWindow")); } 
else { NSLog(@"not canBecomeKeyWindow"); } 
if ([[self window] isKeyWindow]) { dNSLog((@"isKeyWindow")); } 
else { NSLog(@"not isKeyWindow"); } 

और निम्नलिखित प्रतिक्रियाओं मिल गया? "क्या हैविंडो नहीं है"? मुमकिन है यह अच्छा है क्योंकि एप्पल डॉक्स कहना नहीं है "उपयोगकर्ता एक राय यह है कि कुंजी विंडो में नहीं है, डिफ़ॉल्ट रूप से खिड़की आगे लाया और बनाया कुंजी है पर क्लिक करता है, लेकिन माउस घटना भेजा नहीं है, तो।" लेकिन इन घटनाओं का पता लगाने का एक तरीका होना चाहिए। कैसे?

जोड़ना:

[[self window] makeKeyWindow]; 

कोई प्रभाव नहीं, तथ्य यह है कि canBecomeKeyWindow हाँ है के बावजूद है।

+0

खुला रडार पर इस समस्या के बारे में अधिक जानकारी नहीं है: http://openradar.appspot.com/7128269 भी एक का दावा किया वैकल्पिक हल नहीं है, लेकिन मैं वैकल्पिक हल काम नहीं कर सकता। असल में खिड़की सिर्फ कुंजी बनने से इंकार कर देती है, भले ही यह रिपोर्ट कर सकता है। – Dennis

+0

हाय, मुझे एक ही समस्या का सामना करना पड़ा है, क्या आपके पास इसके साथ कोई प्रगति है? मैं इसे हल करने के लिए कुछ weired तरीके की कोशिश की है, मैं एक वैकल्पिक हल लेकिन इसके भयानक बदसूरत, और मेनू स्थिति पट्टी आइटम दिखा हाइलाइट नहीं किया गया के बाद पाया गया है, लेकिन मेनू दिखाया गया है और पूरी तरह से कार्य कर रहा है। मैंने स्थिति आइटम के लिए मेनू सेट किया है और मैन्युअल रूप से मेनू पॉपअप को नियंत्रित किया है। यदि एप्लिकेशन सक्रिय है तो मैं मेनू पॉपअप विधि को कॉल करता हूं, अगर नहीं, तो मैं एप्लिकेशन सक्रिय संदेश भेजता हूं, और कॉलबैक में मैं मेनू खोल रहा हूं। यहां कुछ कोड है। फिर से यह भयानक और बदसूरत। http://gist.github.com/224275 – iafonov

+0

मुझे कहना है कि iafonov का कोड बढ़िया है! हालांकि एक साल पहले !!! हालांकि कोड अप्रासंगिक लगता है। धन्यवाद! यह NSSIew के बारे में सभी समस्याओं का समाधान करता है, NSMenEItem में NSTextEdit। सबसे पहले, NSTextEdit (NSMenuItem में), सामान्य रूप से काम नहीं करता है कुंजी दबाएँ और माउस परिवर्तन नहीं करता है प्राप्त नहीं कर सकते, अब सब कुछ अद्भुत काम करता है !!! कोई स्वीकार नहीं करता है फर्स्ट रेस्पॉन्डर, कोई स्वयं खिड़की नहीं है फर्स्ट रेस्पॉन्डर: xxx, बस iafonov'code। यह महत्वपूर्ण है कि मेन्यू पॉप अप करने का तरीका है। http://gist.github.com/224275 – user377808

उत्तर

9

अपने कस्टम दृश्य को यह जोड़ें और आप ठीक होना चाहिए:

- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent 
{ 
    return YES; 
} 
+1

काम किया, धन्यवाद! – Vojto

4

मैं अपने कस्टम दृश्य के लिए इस विधि जोड़ा है, और अब सब कुछ खूबसूरती से काम करता है:

- (void)viewDidMoveToWindow { 
    [[self window] becomeKeyWindow]; 
} 

आशा इस मदद करता है!

12

अपने कस्टम NSView के लिए इस विधि जोड़ें और यह माउस घटनाओं

- (void)mouseUp:(NSEvent*) event { 
    NSMenuItem* mitem = [self enclosingMenuItem]; 
    NSMenu* m = [mitem menu]; 
    [m cancelTracking]; 
    [m performActionForItemAtIndex: [m indexOfItem: mitem]]; 
} 

लेकिन मैं keyhandling साथ समस्या आ रही है, अगर आप इस समस्या का समाधान हो सकता है आप मेरे सवाल के पास जाकर मेरी मदद कर सकते के साथ ठीक से काम करेंगे थोड़ा सा।

+0

यह मेरे लिए समाधान था! धन्यवाद! – kdbdallas

+0

वाह, मैंने इसे समझने की कोशिश कर आधा दिन बिताया। धन्यवाद – Cory

-1

हाल ही में मैं एक NSStatusItem के लिए एक कस्टम दृश्य दिखाने के लिए, जब उस पर क्लिक करें और स्थिति आइकन पर खींचें और ड्रॉप आपरेशनों का समर्थन एक नियमित NSMenu दिखाने की जरूरत है।

मैं, का उपयोग करते हुए मुख्य रूप से तीन विभिन्न स्रोतों this प्रश्न में पाया जा सकता है कि मेरी समस्या हल।

आशा है कि यह अन्य लोगों को मदद मिलती है।

-1

कस्टममेनस नामक ऐप्पल से नमूना कोड देखें, वहां आपको ImagePickerMenuItemView क्लास में एक अच्छा उदाहरण मिलेगा।

यह एक सामान्य NSMenuItem की तरह एक मेनू अधिनियम में एक दृश्य बनाने के लिए सरल या तुच्छ नहीं है। कुछ वास्तविक निर्णय और कोडिंग करने के लिए कुछ हैं।

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