2010-10-11 11 views
7

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

इस काम को प्राप्त करने के अपने प्रयासों में मैंने प्रोजेक्ट-info.plist फ़ाइल को संशोधित किया है और मुख्य चयन में मेरा एनआईबी फ़ाइल बेस नाम MyDocument से मेरे चयन XIB नाम में बदल दिया है। यह एप्लिकेशन को MyDocument विंडो के बजाय चयन विंडो प्रदर्शित करने का कारण बनता है। इस बिंदु तक कोई समस्या नहीं है।

मेरी चयन विंडो में मैंने अपनी तालिका दृश्य और एक सरणी नियंत्रक और एक कस्टम विंडो नियंत्रक बस इस XIB के लिए सेट अप किया है। मैंने फ़ाइल के मालिक को नए विंडो नियंत्रक में सेट किया है और विंडो नियंत्रक की विंडो प्रॉपर्टी को विंडो में और विंडो की प्रतिनिधि संपत्ति को फ़ाइल के स्वामी के साथ-साथ "चयन करें", "रद्द करें" और "नया" बटन पर बाध्य किया है। एनएसएप्लिकेशंस के लिए कुछ भी बाध्य नहीं है। लेकिन अजीब बात है जब मैं इस आवेदन में यह (अन्य दो बटन के लिए एक ही) त्रुटि के साथ NSApplication को इन नियंत्रकों कनेक्ट करना चाहते हैं लगता है चलाएँ:

कनेक्ट नहीं कर सका कार्रवाई selectButton: वर्ग के लक्षित करने के लिए NSApplication

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

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

किसी भी मदद की बहुत सराहना की जाती है। रोब

उत्तर

9

निब के फ़ाइल के मालिक के वर्ग के लिए आईबी में सेटिंग केवल सलाह है; यह आईबी को केवल उस आउटलेट और कार्यों को दिखाता है जो उस वर्ग के उदाहरणों द्वारा प्रदान की जाती हैं। यह लागू नहीं करता है कि फ़ाइल का स्वामी उस वर्ग का उदाहरण होगा, क्योंकि फ़ाइल का स्वामी निब का हिस्सा नहीं है।

फ़ाइल का स्वामी वह वस्तु है जो निब लोड करता है। इसका जरूरी अर्थ यह है कि यह निब के बाहर है, और निब में कुछ भी इसके बारे में कुछ भी निर्धारित नहीं करता है। मेनमेनू निब के मामले में, इसकी फ़ाइल का स्वामी- ऑब्जेक्ट जो मेनमेनू निब लोड करता है- एनएसएप्लिकेशन इंस्टेंस है। तो, आपके मेनमेनू निब में फ़ाइल के मालिक को जो कुछ भी लगाया गया है, आप एप्लिकेशन ऑब्जेक्ट पर लगाए गए हैं, भले ही आपने आईबी को बताया कि यह एप्लिकेशन नहीं होगा।

कि एप्लिकेशन मेनमेनू निब का मालिक है-चाहे आप जो भी कहते हैं उसके बावजूद आईबी- बग नहीं है। आवेदन हमेशा मेनमेनू निब के मालिक है। यह सामान्य और सही है; आप इसे बदल नहीं सकते हैं, इसे बदलने का प्रयास नहीं करना चाहिए, और इसे बदलने की आवश्यकता नहीं है।

बग, संक्षेप में, यह है कि आप दो अलग-अलग उद्देश्यों के लिए एक निब का उपयोग कर रहे हैं।

आपको मेनमेनू निब को अकेला होना चाहिए जिसमें केवल मुख्य मेन्यू, आपका कस्टम दस्तावेज़ नियंत्रक (मैं इसे एक पल में प्राप्त करूंगा), और आपका ऐप प्रतिनिधि-और पिछले-दस्तावेज़ विंडो को एक अलग में ले जाना चाहिए nib, पिछले दस्तावेज़ दस्तावेज नियंत्रक के स्वामित्व में। विंडो नियंत्रक को इस निब के मालिक होने के लिए, आपको विंडो नियंत्रक को लोड करने की आवश्यकता है। आपको कोड में ऐसा करना होगा-आप इसे आईबी या प्लिस्ट में सेट नहीं कर सकते हैं।

अपने एप्लिकेशन के प्रतिनिधि में, विंडो नियंत्रक को तुरंत चालू करें और उसका स्वामी बनें। ऐसा लगता है कि आपने एक कस्टम NSWindowController सबक्लास बनाया है, ताकि आप इसे init ओवरराइड कर सकें ताकि यह खुद को initWithWindowNibName: संदेश को निब लोड और मालिक के पास भेज सके। फिर, ऐप प्रतिनिधि से विंडो नियंत्रक बनाने के लिए बस alloc और init का उपयोग करें।

यह कंसोल संदेश से छुटकारा पायेगा, और सुनिश्चित करेगा कि बटन वास्तव में विंडो नियंत्रक के लिए लगाए गए हैं (क्योंकि वे फ़ाइल के स्वामी से जुड़े हुए हैं, जो इस परिवर्तन के साथ विंडो नियंत्रक होगा) ।

क्या आपके ऐप प्रतिनिधि applicationOpenUntitledFile: पर showWindow: संदेश भेजकर applicationOpenUntitledFile: का जवाब देते हैं। इससे पिछली-दस्तावेज़ विंडो दिखाई देगी जब भी उपयोगकर्ता सामान्य रूप से एक नया दस्तावेज़ बना लेता।

आप दस्तावेज़ बनाने के सामान्य तरीकों समर्थन करना चाहते हैं (जैसे कि, नया दस्तावेज़ काम करने की अनुमति), तो applicationDidFinishLaunching: और applicationShouldHandleReopen:hasVisibleWindows:, नहीं applicationOpenUntitledFile: लागू। सुनिश्चित करें कि कोई दस्तावेज़ खुला नहीं है, और यदि ऐसा है तो अपनी विंडो दिखाएं।

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

+0

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

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