2011-01-12 14 views
6

के अंदर NSProgressIndicator का उपयोग करना मैं स्टेटसबार-मेनू के अंदर एक NSProgressIndicator (अनिश्चित) का उपयोग करने का प्रयास कर रहा हूं। मैं मेन्यूइटम के लिए एनएसवी व्यू-ऑब्जेक्ट का उपयोग कर रहा हूं, और फिर इसे प्रदर्शित करने के लिए प्रगति संकेतक का सबूत करता हूं। लेकिन जब भी मैं शुरू करने की कोशिश करता हूं एनीमेशन: प्रगति के लिए, कुछ भी नहीं होता है। जब मैं एक सामान्य NSWindow पर एक ही चीज़ करने की कोशिश करता हूं तो यह पूरी तरह से काम करता है, बस मेन्यूइटम के अंदर नहीं।NSMenuItem

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

संपादित करें:

ठीक है, लगभग अब काम करता है। SetUsesThreadedAnimation का उपयोग करते समय: और मेनूडिलेगेट के मेनू से ऊपर खोलें और नया थ्रेड बनाएं। (?)

-(void) doWork(NSProgressIndicator*) p{ 
    [p startAnimation:self]; 
} 

यह जब मेनू को खोलकर एक यादृच्छिक आधार पर progressindicator शुरू कर देंगे: यह धागा एक स्थानीय विधि चलाता है। अगर मैं doWork: (अभी भी एक नए धागे का उपयोग कर) के बिना startAnimation: पर कॉल करता हूं, तो यह कभी काम नहीं करता है। setUsesThreadedAnimation: क्या प्रगति-बार एनीमेशन के लिए अपना स्वयं का धागा बनाते हैं?

उत्तर

16

का उपयोग करके इसे हल:

[progressIndicator performSelector:@selector(startAnimation:) 
          withObject:self 
          afterDelay:0.0 
           inModes:[NSArray 
         arrayWithObject:NSEventTrackingRunLoopMode]]; 

menuWillOpen अंदर :, समस्या startAnimation बुला गया लगता है: इससे पहले कि प्रगति ही ड्राइंग समाप्त हो गया था।

+0

उस सलाह के लिए आपको बहुत बहुत धन्यवाद, यह वास्तव में मदद करता है! – Yojik

+0

पागल कितनी देर तक मैं यह काम करने के लिए खोज कर रहा हूं, बहुत बहुत धन्यवाद! – Jasper

+0

धन्यवाद दोस्त! धन्यवाद दोस्त! धन्यवाद दोस्त! –

0

क्या आपने इसे थ्रेड एनीमेशन का उपयोग करने के लिए कहा है -setUsesTreadedAnimation :?

+0

हां, मदद नहीं करता है। – Henrik

1

आप NSProgressIndicator का संदर्भ कैसे देख रहे हैं जो दृश्य में है (और खिड़की में एक, उस मामले के लिए)? उदाहरण के लिए, क्या आपके पास नियंत्रक वर्ग है जिसमें प्रगति संकेतकों के लिए IBOutlet है? यदि आप IBOutlet का उपयोग कर रहे हैं, तो क्या आप सुनिश्चित हैं कि यह nib फ़ाइल में ठीक से जुड़ा हुआ है?

इसके अलावा, आप कहां और कब startAnimation: पर कॉल कर रहे हैं? (हमें कुछ कोड देखने की ज़रूरत है)।

एक चीज जो कभी-कभी हो सकती है यह है कि आप निब में IBOutlet को हुक करना भूल जाते हैं। फिर, जब आप ऑब्जेक्ट को रनटाइम पर कोड में कुछ करने का प्रयास करते हैं, तो IBOutletnil है, और इसलिए आपको लगता है कि आपके ऑब्जेक्ट पर एक संदेश भेजा जा रहा है वास्तव में, एक संदेश nil पर भेजा जा रहा है। दूसरे शब्दों में, यह सिर्फ अनदेखा किया गया है, और प्रभावी ढंग से ऐसा लगता है कि यह काम नहीं कर रहा है।

बशर्ते आपके पास UI ऑब्जेक्ट का एक (संभावित रूप से) मान्य संदर्भ हो, तो आप जो अन्य आम समस्या देखेंगे, वह तब होता है जब कोई डेवलपर किसी समय के "बहुत जल्दी" ऑब्जेक्ट को संदेश भेजने का प्रयास कर रहा होता है। सामान्य रूप से, init नियंत्रक ऑब्जेक्ट के जीवनकाल में विधियों को उपयोगकर्ता इंटरफ़ेस ऑब्जेक्ट्स को संदेश भेजने में सक्षम होने के लिए बहुत जल्दी हैं- IBOutlet अभी भी nil हैं। -awakeFromNib को IBOutlet कहा जाना चाहिए (बशर्ते आप उन्हें आईबी में जोड़ दें) और फिर आप यूआई ऑब्जेक्ट को संदेश भेज सकते हैं।

+0

अच्छे अंक, जो बताते हैं कि आउटलेट-घटकों तक पहुंचने की कोशिश करते समय मुझे कभी-कभी शून्य-मूल्य क्यों होते थे (उन्हें बहुत जल्दी बुलाते थे)। अब मैं इसे एक ड्राइंग समस्या को कम करने लग रहा था।मैंने इसे एनिमेट किया है जब दृश्य युक्त मेन्यूइटम को हाइलाइट किया गया है (मेरे दृश्य के drawRect :) में, और फिर इसे हाइलाइट करते समय इसे रोक दें। लेकिन अगर मैं इसे if-clause के बाहर एनिमेट करने का प्रयास करता हूं जो जांचता है कि आइटम हाइलाइट किया गया है तो कुछ भी नहीं होता है (अभी भी drawRect के अंदर :)। – Henrik

+0

मैंने इसे कुछ और काम करने में कामयाब रहा है, ऐसा लगता है कि मुझे स्टॉप भेजना था: एनीमेशन: शुरू करने से कुछ समय पहले एनीमेशन: काम। लेकिन जब मैं मेनू प्रदर्शित होता हूं तो मैं इसे एनिमेट करना चाहता हूं (या नहीं)। वर्तमान में मुझे इसे शुरू करने के लिए माउस को देखना है, जब वे मेनू प्रदर्शित होते हैं तो यह केवल प्रगति पट्टी को एनिमेटिंग नहीं दिखाता है, भले ही इसे छुपाया जाना चाहिए (सेटडिस्प्लेहेनस्टॉप: नहीं)। अगली टिप्पणी में जारी रखने के लिए ... – Henrik

+0

और मैं इसे अभी भी अपने दृश्य-वस्तु के बाहर से कॉल करते समय काम नहीं कर सकता, उदा। एनएसएनएनयू के सबव्यू के माध्यम से इसके नियंत्रक वर्ग में नेविगेट करना। ऐसा लगता है कि एनीमेशन के काम के लिए मेनू प्रदर्शित होने पर कुछ प्रकार की घटना होनी चाहिए। – Henrik

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