2012-01-18 16 views
9

मैं अपने पहले मैक दस्तावेज़-आधारित एप्लिकेशन पर काम कर रहा हूं। इस तरह केNSDocumentController currentDocument रिटर्निंग शून्य

- (BOOL)readFromURL:(NSURL *)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError; 
- (BOOL)writeToURL:(NSURL *)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError; 
- (void)makeWindowControllers; 

मुख्य विंडो नियंत्रक के रूप में

मैं NSDocument subclassed है, reimplementing तरीकों NSWindowsController का एक उपवर्ग, कि दो NSViewController उपवर्गों होता है।

मुझे जिस समस्या का सामना करना पड़ रहा है वह यह है कि मुझे इन व्यू कंट्रोलर से वर्तमान दस्तावेज़ तक पहुंच की आवश्यकता है। मैं क्या करता हूं

MyDocument *myDocument = [[NSDocumentController sharedController] currentDocument]; 

पहले, एप्लिकेशन शुरू करने के ठीक बाद, एक नया दस्तावेज़ बनाया गया है। फिर, मुख्य विंडो और इसके दृश्य नियंत्रक बनाए जाते हैं, लेकिन उपरोक्त विधि शून्य लौटाती है। यहाँ लॉग (NSLog उपयोग करते हुए) मैं प्राप्त होते हैं:

Just created this new document: <MyDocument: 0x10040ff10> 
I'm in a view controller and current document is (null) 

उसके बाद, एक नया दस्तावेज़ बनाने और एक गैर शून्य सूचक में इस विधि परिणाम बुला, लेकिन यह सही दस्तावेज़ पर इंगित नहीं करता है, लेकिन पहले एक करने के लिए:

Just created this new document: <MyDocument: 0x100437e10> 
I'm in a view controller and current document is <MyDocument: 0x10040ff10> 

सूचना है कि दूसरी दस्तावेज़ निर्माण के बाद, पहले दस्तावेज़ में और नहीं एक दूसरे को currentDocument अंक।

कोई भी विचार जो मैं याद कर रहा हूं या गलत कर रहा हूं? currentDocumentNSDocumentController के लिए सेट कब है?

उत्तर

2

NSDocumentControllercurrentDocument पर एप्पल प्रलेखन यह कहते हैं से:

इस विधि रिटर्न शून्य जब अपने आवेदन सक्रिय नहीं है अगर यह कहा जाता है। यह ड्रैग-एंड-ड्रॉप ऑपरेशन, के प्रसंस्करण के दौरान हो सकता है, उदाहरण के लिए, readSelectionFromPasteboard के कार्यान्वयन में:। इस तरह के एक मामले में, एक NSView दस्तावेज़ के साथ जुड़े उपवर्ग से बजाय निम्न संदेश भेजें:

[[[self window] windowController] document];

यह थोड़ा अस्पष्ट रूप में यह वास्तव में योग्य नहीं है क्या "सक्रिय नहीं" का अर्थ है। यह हो सकता है कि एक ड्रैग 'एन ड्रॉप ऑपरेशन एकमात्र ट्रिगर है लेकिन यह यह नहीं बताता है कि ऐप सक्रिय होने के लिए यह एकमात्र ट्रिगर है या नहीं।

शायद ऐप्पल द्वारा सुझाए गए विकल्प आपके लिए उपयोग में हैं।

+0

धन्यवाद, लेकिन मैंने पहले से ही कोशिश की है और मैं अभी भी परिणाम के रूप में शून्य हो रहा हूं। मैं ऐप्पल के लिए "सक्रिय नहीं" के बारे में भी अनिश्चित था, लेकिन मेरे मामले में यह ऐप शुरू करने के ठीक बाद होता है। कोई ड्रैग-एंड-ड्रॉप नहीं, कुछ विशेष नहीं है। – msoler

0

किसी भी कारण आप अपने NSViewController उपवर्ग में अपने NSWindowController उपवर्ग से -[self document] (या -[[self window] document] फोन नहीं कर सकते हैं? यही कारण है कि सामान्य रूप से यह कैसे कोको में एक दस्तावेज़ आधारित एप्लिकेशन में किया जाता है है।

मूल रूप से जब NSDocument (उपवर्ग) बनाया गया है, फिर यह सभी NSWindowControllers बनाता है और उन्हें दस्तावेज़ में संलग्न करता है।

अधिक महत्वपूर्ण बात यह है कि [[NSDocumentController sharedController] currentDocument] सही जानकारी वापस नहीं करेगा यदि आपके पास 2 दस्तावेज़ खुले हैं और अचानक दोनों की सामग्री को आकर्षित करने की आवश्यकता है। इसके बजाय, NSWindowController को इसकी विंडो में विचारों के प्रवाह के नियंत्रण को नियंत्रित करना है ताकि आप एक ही समय में अग्रभूमि और पृष्ठभूमि में परिवर्तनों को प्रबंधित कर सकें (जैसे हो सकता है कि यदि आपके ऐप में सभी विंडो के लिए बैकिंग स्टोर होना आवश्यक हो एक ही समय में ताज़ा)।

+0

धन्यवाद। NSViewController subclass से '[[self window] दस्तावेज़] को कॉल करके दस्तावेज़ तक पहुंचना संभव नहीं है क्योंकि NSViewController में _view_ प्रॉपर्टी है लेकिन _window_ प्रॉपर्टी नहीं है। एक NSViewController से '[[[self window] windowController] दस्तावेज़] 'एनएसवी व्यू और' [[[[स्वयं दृश्य] विंडो] विंडो नियंत्रक] दस्तावेज़]' (जैसा कि @roger द्वारा इंगित किया गया है) का उपयोग करना और सही दस्तावेज़ वापस करना। विंडोज़/विचारों को शुरू करने के बाद वे काम करते हैं, यह उल्लेख करना महत्वपूर्ण है, जो मेरे लिए ठीक और समझदार है। – msoler

+0

क्षमा करें, मैं इस तथ्य को याद करता हूं कि आप NSViewControllers का उपयोग कर रहे थे। मैंने NSViewControllers का उपयोग करते समय एक और जवाब जोड़ा है जो एमवीसी प्रतिमान में अधिक जाता है। उम्मीद है कि यह एक और अधिक उपयोगी है। – gaige

6

(मैं पिछले जवाब को जगह में छोड़ रहा हूं क्योंकि यह NSView के उप-वर्ग के लिए पूछे जाने पर प्रश्न का उत्तर देता है, लेकिन अब मूल पोस्टर ने कहा है कि वह NSViewController का उपयोग कर रहा था, अलग-अलग विचार हैं)।

NSViewController-नियंत्रित दृश्य के मामले में, NSViewControllerrepresentedObject संपत्ति का उपयोग करके अपने डेटा से जुड़ा हुआ है। इस अमूर्तता का उद्देश्य NSViewController के नियंत्रक द्वारा प्रबंधित किया जाना है, जो आपके NSWindowController जैसा लगता है।

इस पर निर्भर करता है कि आप कितना encapsulation/प्रदान करना चाहते हैं, आप दस्तावेज़ को NSViewControllers (यदि वे पूरे दस्तावेज़ पर काम करते हैं) पर धक्का दे सकते हैं या केवल उस दस्तावेज़ से जानकारी को धक्का दे सकते हैं जो विशेष NSViewController के लिए जर्मनी है ।

उदाहरण के लिए, मैं एक ऐसे सॉफ्टवेयर का एक टुकड़ा मानूंगा जो एक ट्रेन के बारे में डिज़ाइन जानकारी संपादित करता है: इंजन, कारें और कैबोज़। NSDocument उप-वर्ग में एक इंजन ऑब्जेक्ट, एक कैबोज़ ऑब्जेक्ट, और 0 या अधिक कार ऑब्जेक्ट्स शामिल हैं। इस मामले में, आपके पास 3 NSView एस हो सकता है, प्रत्येक अपने स्वयं के NSViewController के साथ अपने ऑब्जेक्ट्स के विचारों में से बाहर और बाहर डेटा को संभालने के लिए।

एनएसविंडो कंट्रोलर प्रत्येक NSViewController के representedObject को उस ऑब्जेक्ट में सेट करने के लिए संभालता है जो इसे समझता है। उदाहरण के लिए, जब विचारों लोड होने, खिड़की नियंत्रक तो करेंगे:

[engineViewController setRepresentedObject: engine]; 
    [cabooseViewController setRepresentedObject: caboose]; 

उसके बाद, आप कारों की सूची, और दिखाने के लिए (जब एक कार देखा जा रहा है) एक NSTableView उपयोग कर सकते हैं, खिड़की नियंत्रक सका फिर चयन बदलते समय [carViewController setRepresentedObject: car]; का उपयोग करें (या आप बाइंडिंग का उपयोग कर सकते हैं, इस पर निर्भर करता है कि आपका कोड कैसे संरचित किया गया है)।

इस तरह, आप एमवीसी प्रतिमान का सबसे अच्छा लाभ लेते हैं, क्योंकि नियंत्रक मॉडल के विचारों को आवश्यकतानुसार जोड़ते हैं, लेकिन दस्तावेज़ संरचना केवल शीर्ष स्तर NSWindowController द्वारा ही समझा जाता है।

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