2009-11-12 8 views
25

से कई सबव्यूव्स मुझे इंटरफेस बिल्डर और एनएसवीव कंट्रोलर के साथ विचार लोड करने के आसपास अपने सिर को लपेटने में मुश्किल हो रही है।एनएसवी व्यूंट्रोलर और निब

मेरा लक्ष्य एक ऐसा दृश्य है जो निम्न वर्णन को पूरा करता है: शीर्ष पर शीर्ष बार (टूलबार की तरह लेकिन बिल्कुल नहीं) जो दृश्य की पूरी चौड़ाई और नीचे एक दूसरा "सामग्री दृश्य" फैलाता है। यह समग्र दृश्य मेरे NSViewController सबक्लास के स्वामित्व में है।

इसके लिए इंटरफेस बिल्डर का उपयोग करना समझ में आया। मैंने एक दृश्य निब बनाया है, और इसमें दो सबव्यूव्स जोड़े हैं, उन्हें ठीक से बाहर रखा है (शीर्ष बार और सामग्री दृश्य के साथ)। मैंने File's Owner को MyViewController, और कनेक्टेड आउटलेट और इस तरह सेट किया है।

जिन विचारों में मैं लोड करना चाहता हूं (बार और सामग्री) भी अपने स्वयं के निब में हैं (यह हो सकता है कि यह मुझे परेशान कर रहा हो) और उन निब्सों के पास उनके कस्टम क्लास को संबंधित एनएसवी व्यूक्लास पर लागू किया गया हो। मुझे यकीन नहीं है कि उनके File's Owner के रूप में सेट करना है (मैं MyController अनुमान लगा रहा हूं क्योंकि यह उनका स्वामी होना चाहिए)।

अलास, जब मैं MyViewController का एक उदाहरण init में से कोई भी वास्तव में प्रदर्शित नहीं करता है। मैंने इसे अपनी विंडो की सामग्री में जोड़ा है ठीक से देखें (मैंने अन्यथा जांच की है), और वास्तव में, चीजों की तरह लोड। यही है, awakeFromNib बार दृश्य में भेजा जाता है, लेकिन यह विंडो में प्रदर्शित नहीं होता है। मुझे लगता है कि मुझे निश्चित रूप से कहीं कुछ तार पार हो गए हैं। शायद कोई मेरी निराशा से छुटकारा पाने के लिए हाथ उधार दे सकता है?

संपादित कुछ कोड को दिखाने के लिए मैं क्या कर रहा

नियंत्रक लोड किया जाता है जब मेरी ऐप्लिकेशन को लॉन्च करने खत्म एप्लिकेशन प्रतिनिधि से,:

MyController *controller = [[MyController alloc] initWithNibName:@"MyController" bundle:nil]; 
[window setContentView:[controller view]]; 

और फिर मेरी initWithNibName मैं डॉन में ' कुछ भी नहीं करते लेकिन अभी सुपर के लिए कॉल करें।

+0

अपना कोड पोस्ट करें। यह स्पष्ट नहीं है कि आप अपने व्यू कंट्रोलर को कैसे प्रारंभ कर रहे हैं। –

उत्तर

71

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

कोड का एक त्वरित बिट - इस कोड में, मैं मुख्य सामग्री को देखने नियंत्रक MainViewController फोन कर रहा हूँ, "टूलबार" के लिए नियंत्रक TopViewController है, और सामग्री के बाकी ContentViewController

//MainViewController.h 
@interface MainViewController : NSViewController 
{ 
    //These would just be custom views included in the main nib file that serve 
    //as placeholders for where to insert the views coming from other nibs 
    IBOutlet NSView* topView; 
    IBOutlet NSView* contentView; 
    TopViewController* topViewController; 
    ContentViewController* contentViewController; 
} 

@end 

//MainViewController.m 
@implementation MainViewController 

//loadView is declared in NSViewController, but awakeFromNib would work also 
//this is preferred to doing things in initWithNibName:bundle: because 
//views are loaded lazily, so you don't need to go loading the other nibs 
//until your own nib has actually been loaded. 
- (void)loadView 
{ 
    [super loadView]; 
    topViewController = [[TopViewController alloc] initWithNibName:@"TopView" bundle:nil]; 
    [[topViewController view] setFrame:[topView frame]]; 
    [[self view] replaceSubview:topView with:[topViewController view]]; 
    contentViewController = [[ContentViewController alloc] initWithNibName:@"ContentView" bundle:nil]; 
    [[contentViewController view] setFrame:[contentView frame]]; 
    [[self view] replaceSubview:contentView with:[contentViewController view]]; 
} 

@end 
+0

एक आकर्षण की तरह काम करता है। उदाहरण और पूरी तरह से स्पष्टीकरण दोनों के लिए धन्यवाद! – jbrennan

+0

धन्यवाद, यह बहुत उपयोगी था। ++ – ttvd

2

है MainViewController NSWindowController का उप-वर्ग नहीं होना चाहिए? और मुख्य मेनू में MainMenu.xib में तत्वों को देखने के लिए कक्षा में आउटलेट जुड़े हुए हैं? आइए आशा करते हैं कि पुराने धागे अभी भी पढ़ रहे हैं ...

+1

यह आवश्यक नहीं है। मेरी राय में दृश्य नियंत्रक से विंडो नियंत्रक को अलग करने के लिए भी एक अच्छा अभ्यास है जो पूरी विंडो के सामग्री दृश्य को प्रबंधित करता है। एक खिड़की के दृश्य से बहुत अधिक भागों और कार्यक्षमता है (संबंधित दृश्य नियंत्रक के साथ)। –

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