2012-04-12 15 views
9

आईओएस ऐप्स के साथ गड़बड़ करने के बाद, मैंने सोचा कि मैं कोको ऐप को एक भंवर मानता हूं कि चीजें बहुत समान होंगी। तो मेरे पास एक सिंगल विंडो ऐप है जिसमें एक स्प्लिट व्यू और कुछ NSTableView एस (थिंक आईट्यून्स) हैं और मैं अपना कोड डालने के लिए एक जगह ढूंढ रहा हूं जो टेबल से भरने के लिए वेब से डेटा लाएगा।(कोको) एक खिड़की कोको ऐप में UIViewController उपclass के बराबर क्या है?

आईओएस में मैं इसे उचित UIViewController सबक्लास के viewDidLoad विधि में रखूंगा। UITableViewDataSource तब इस डेटा को अपनी कोशिकाओं को पॉप्युलेट करने के लिए एक्सेस करेगा।

अब मेरे पास NSWindow है जिसके लिए मैं एक समान काम कर सकता हूं लेकिन मैं इसके लिए NSWindowController कैसे बना सकता हूं? क्या यह भी मुझे चाहिए? मैं इसे AppDelegate में डाल सकता हूं लेकिन सही नहीं लगता है।

उत्तर

12

iOS और ओएस एक्स के बीच का अंतर आईओएस में केवल एक ही खिड़की है लेकिन ओएस एक्स काम की तुलना में अलग है कि NSViewController में UIViewControllers में ओएस एक्स NSViewControllers में एक से अधिक लोड और एक ही दृश्य को संभालने के लिए डिज़ाइन किया गया है वहाँ हो सकता है, जबकि UIViewControllers (आईओएस ज्ञान की मेरी सापेक्ष कमी के लिए माफ़ी) कई विचारों को संभालने लगते हैं और विचारों के बीच गोंद प्रदान करते हैं।

भी Apple docs लिखते हैं कि:

मैक ओएस एक्स में, AppKit दृश्य नियंत्रकों खिड़की नियंत्रक है, जो सब कुछ है कि विंडो में चला जाता है के लिए उत्तरदायी है सहायकों हैं।

इसलिए, ओएस एक्स में UIViewController के लिए समकक्ष NSViewController बल्कि NSWindowController, नहीं है, लेकिन जो ओएस एक्स के लिए एक अलग विंडो की सम्पूर्णता और लेआउट/सामग्री के प्रबंधन के द्वारा प्रदान करता है ज्यादा क्या UIViewController iOS के लिए करता है की/भीतर विचारों की बातचीत।

आपके मामले में, मैं NSWindowController का उपयोग करूंगा - हालांकि यदि ऐप बहुत आसान है, तो App Delegate भी काम करता है; और यदि ऐप बहुत जटिल है, तो कोड को विभाजित करने के लिए NSViewController का उपयोग करना एक बुरा विचार नहीं होगा।

एक NSWindowController का उपयोग किया जाएगा प्रोग्राम के [[CustomWindowController alloc] init] और

@implementation CustomWindowController 
- (id)init 
{ 
    self=[super initWithWindowNibName:@"CustomWindowNibName"]; 
    if(self) 
    { 
     //perform any initializations 
    } 
    return self; 
} 
@end 

या

[[CustomWindowController alloc] initWithWindowNibName:@"CustomWindowNibName"]; 

सीधे कॉलिंग का उपयोग करके (और initWithWindowNibName अधिभावी) अगर आप चाहते हैं अनुप्रयोग प्रतिनिधि में लोड करने के लिए क्या करने के लिए सबसे अच्छा तरीका है यह पुन: प्रयोज्य हो सकता है।

और आप MainMenu.xib में डिफ़ॉल्ट विंडो को हटा सकते हैं।


मूल रूप से, अधिक बार नहीं की तुलना में, एक NSWindowController एक खिड़की का अपना निब फ़ाइल में instantiated प्रबंधन करता है। NSWindowController आमतौर पर उस निब फ़ाइल का मालिक है। (हालांकि यह प्रोग्रामेटिक रूप से बनाई गई विंडो को प्रबंधित करना संभव है, यह आमतौर पर ऐसा नहीं होता है।)

कस्टम NSWindowController का उपयोग करने में सक्षम होने के लिए, इसलिए आपको अपनी विंडो-टू-प्रबंधित करने की आवश्यकता है एक अलग निब/xib फ़ाइल में।(डिफ़ॉल्ट xib फ़ाइल का उपयोग करने का अर्थ है कि आप कोको को स्वचालित रूप से एनएसविंडो कंट्रोलर को सबक्लासिंग के अवसर के बिना तुरंत चालू करने की अनुमति देते हैं; आप डिफ़ॉल्ट NSWindowController को डिफ़ॉल्ट NSMainNibFile के साथ उपयोग नहीं कर सकते हैं। एक साधारण ऐप के लिए, बस एनएसपीप्लिकेशन/ऐप प्रतिनिधि में सभी नियंत्रक कोड डालें)

Xcode 4 में कम से कम, इस प्रक्रिया खिड़की टेम्पलेट और कस्टम NSWindowController वर्ग के साथ एक xib बनाने, -init या जहां में है कि निब के आधार पर CustomWindowController वर्ग instantiating और फिर बुला [CustomWindowController showWindow:self]; (शामिल है या यह है कि अगर ऐसा नहीं करता काम, -makeKeyAndOrderFront:) वास्तव में विंडो दिखाने के लिए (- (void)applicationDid/WillFinishLaunching:(NSNotification *)aNotification में एक अच्छी जगह हो सकती है)।

डिफ़ॉल्ट विंडो को दिखने से रोकने के लिए मैं इसे हटा देता हूं। शायद एक बेहतर तरीका है लेकिन मुझे यह नहीं पता है।

+0

हाँ मुझे लगा कि मुझे एनएसविंडो कंट्रोलर का उपयोग करने की आवश्यकता है, लेकिन मुझे यकीन नहीं था कि इसे एनएसविंडो में कैसे लगाया जाए। मैंने MainMenu.xib में एक नई विंडो खींचा और इसे सेट अप किया लेकिन जब मैं ऐप चलाता हूं तो इसे पहले ही लोड किया जा रहा है। मैंने चीजों को शुरू करने के लिए ऐपडिलेगेट का उपयोग करने का भी प्रयास किया लेकिन मुझे नहीं पता कि उदाहरण के लिए कैसे। NSTableViewDataSource प्रोटोटाइप विधियों के लिए AppDelegate.m में मेरा NSTableView देखो। मैंने तालिका से 'फ़ाइल के स्वामी' और चयनित डेटा स्रोत से कनेक्ट करने का प्रयास किया लेकिन यह 'अमान्य एनएसटीबल दृश्य डेटा स्रोत' त्रुटि में विफल रहता है। – TijuanaKez

+0

NSWindowController को हुक करने का सबसे आसान तरीका है अपनी निब फ़ाइलों को विभाजित करना और इसे लोड करने के लिए अपनी फ़ाइल देना। तो विंडो टेम्पलेट का उपयोग करके एक नई निब फ़ाइल बनाएं और फ़ाइलों के मालिक को नियंत्रक पर सेट करें। साथ ही, डेटा स्रोत से कनेक्ट करने के आपके प्रयास के बारे में: उस मामले में 'फ़ाइल का स्वामी' एनएसएप्लिकेशंस था; आप ऐप प्रतिनिधि को इसके बजाय खींचना चाहते हैं। – Vervious

+0

ठीक है इसलिए मैंने एक नया नियंत्रक 'मेनविंडो कंट्रोलर' बनाया और 'xib फ़ाइल के साथ' चिपकाया। मैंने NSMindow को MainMenu.xip से कॉपी किया और इसे पुराने मेन्यूंडो कंट्रोलर.एक्सिब फ़ाइल में पुराना हटा दिया। फ़ाइल के मालिक का 'कस्टम क्लास' मेनविंडो कंट्रोलर पर सेट है। मैंने 'self = [super initWithWindowNibName: @ "MainWindowController"] के साथ MainWindowController.m में कस्टम इनिट विधि जोड़ा; '। मैं ऐप प्रतिनिधि 'applicationDidFinishLaunching' विधि में' MainWindow = [[MainWindowController alloc] init] के साथ मेरी मेनविंडो कंट्रोलर प्रॉपर्टी को तुरंत चालू करता हूं; '.. कोई त्रुटि नहीं, लेकिन कोई विंडो नहीं। मुझे कुछ याद आया? – TijuanaKez